首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于TPH的实体框架或操作中的条件映射

基于TPH的实体框架或操作中的条件映射
EN

Stack Overflow用户
提问于 2012-10-18 11:19:24
回答 1查看 919关注 0票数 0

我们有一个像Vehicle这样的实体,还有三个派生实体,比如CarMotorbikeBicycle。这个继承层次结构是用TPH实现的。

以下是实体映射条件:

  • 汽车用__disc__ = car
  • 摩托车__disc__ = motorbike
  • 自行车__disc__ = bicycle 如何从VehicleMotorVehicle派生另一个具有以下映射条件的子级:
  • __disc__ = car OR motorbike for MotorVehicle

当我使用TPT使用这个结构时,我会在数据库中这样查看

代码语言:javascript
复制
SELECT    Id
FROM      Vehicles
WHERE     (__Disc__ = N'car') OR (__Disc__ = N'motorbike')

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

请注意,i不能改变这样的继承:车辆<--机动车<--汽车。不要把汽车当成汽车和其他孩子的父母,因为汽车、摩托车和自行车已经存在了。我只想给所有的机动车辆分配一些业务。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-18 23:41:22

为什么不能在类层次结构中引入MotorVehicle级别?你可以的。它只是一个抽象类,所以它不需要一个判别器值。英孚几乎没注意到这门课!

我尝试使用和不使用MotorVehicle类,数据库结构和定义的鉴别器的数量在这两种情况下都是相同的。

编辑

我就是这样做的:

代码语言:javascript
复制
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);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12953428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档