实体框架中的条件映射 - 与TPH的OR操作

时间:2012-10-18 11:19:25

标签: entity-framework inheritance tph

我们有一个像Vehicle这样的实体和三个派生实体,例如CarMotorbikeBicycle。 此继承层次结构使用 TPH

实现

以下是实体映射条件:

  • __disc__ = car for Car
  • __disc__ = motorbike for Motorbike
  • __disc__ = bicycle for Bicycle

    我如何 Vehicle获取另一个孩子,例如MotorVehicle,并具有以下映射条件:

  • __disc__ = car OR motorbike适用于MotorVehicle

当我使用 TPT 进行此结构时,我会在数据库中查看:

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

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

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

1 个答案:

答案 0 :(得分: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);
    }
}