0

我们有一个类似实体和三个派生实体,Vehicle例如和。这个继承层次是用TPH实现的。CarMotorbikeBicycle

以下是实体映射条件:

  • __disc__ = car车用
  • __disc__ = motorbike摩托车
  • __disc__ = bicycle自行车

    如何使用以下映射条件Vehiclelike派生另一个孩子MotorVehicle

  • __disc__ = car OR motorbike机动车

当我使用TPT具有这种结构时,我会在数据库中这样查看:

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

我认为 TPH 不需要这种观点。

请注意,我不能像这样更改继承:Vehicle<-- MotorVehicle<-- Car. 不要考虑注入汽车作为汽车和其他孩子的父母,因为汽车和摩托车和自行车已经存在。我只想为所有机动车辆分配一些业务。

4

1 回答 1

0

为什么不能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);
    }
}
于 2012-10-18T23:41:22.710 回答