我们有一个像Vehicle
这样的实体和三个派生实体,例如Car
,Motorbike
和Bicycle
。
此继承层次结构使用 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。不要考虑将汽车作为汽车和其他孩子的父母注入,因为汽车和摩托车和自行车已经存在。我只是想为所有汽车分配一些业务。
答案 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);
}
}