Условное сопоставление в Entity Framework - ИЛИ операция с TPH

У нас есть такой объект, как Vehicle и три производных объекта, такие как Car, Motorbike а также Bicycle, Эта иерархия наследования реализована с помощью TPH.

Вот условия отображения сущности:

  • __disc__ = car для автомобиля
  • __disc__ = motorbike для мотоцикла
  • __disc__ = bicycle для велосипеда

    Как я могу родить другого ребенка от Vehicle лайк MotorVehicle со следующим условием отображения:

  • __disc__ = car OR motorbike для автомобилей

Я бы посмотрел в базе данных, как это, когда у меня была эта структура с TPT:

SELECT    Id
FROM      Vehicles
WHERE     (__Disc__ = N'car') OR (__Disc__ = N'motorbike')

Я думаю, что эта точка зрения не требуется с TPH.

Обратите внимание, что я не могу изменить наследство следующим образом: Автомобиль<- MotorVehicle <- Автомобиль. Не думайте о том, чтобы впрыскивать автомобили в качестве родителя автомобиля и других детей, потому что автомобиль, мотоцикл и велосипед уже существуют. Я просто хочу назначить какое-то дело на все автомобили.

1 ответ

Решение

Почему вы не могли представить MotorVehicle уровень в иерархии классов? Вы можете. Это просто абстрактный класс, поэтому ему не нужно значение дискриминатора. EF едва замечает класс!

Я пробовал как с, так и без MotorVehicle класс и структура базы данных, а также число определенных дискриминаторов были одинаковыми в обоих случаях.


редактировать

Вот что я сделал:

public abstract class Vehicle
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public abstract class MotorVehicle : Vehicle
{
    public int Hp { get; set; }
}

public class Car : MotorVehicle
{ }

public class MotorBike : MotorVehicle
{ }

public class Bicycle : Vehicle
{ }

internal class NestedInheritanceContext : DbContext
{
    public DbSet<Vehicle> Vehicles { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Vehicle>().Property(v => v.Name).IsRequired();
        modelBuilder.Entity<Car>().Map(m => m.Requires("Discriminator")
            .HasValue("car").HasColumnType("char")
            .HasMaxLength(10)
            .IsRequired());
        modelBuilder.Entity<MotorBike>().Map(m => m.Requires("Discriminator")
            .HasValue("motorbike"));
        modelBuilder.Entity<Bicycle>().Map(m => m.Requires("Discriminator")
            .HasValue("bicycle"));
        base.OnModelCreating(modelBuilder);
    }
}
Другие вопросы по тегам