【问题标题】:Conditional Mapping in Entity Framework - OR operation with TPH实体框架中的条件映射 - 使用 TPH 进行 OR 操作
【发布时间】:2012-10-18 11:19:24
【问题描述】:

我们有一个类似Vehicle 的实体和三个派生实体,例如CarMotorbikeBicycle。 此继承层次结构是通过 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 不需要此视图。

请注意我不能像这样更改继承:Vehicle

【问题讨论】:

    标签: entity-framework inheritance tph


    【解决方案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);
        }
    }
    

    【讨论】:

    • 你的意思是我没有在 DAL 中实现 MotorVehicle,对吧?那么,DAL 中没有机动车辆,但这是与业务相关的事情,对吧?
    • 能否请您提供更多详细信息并提供型号?我无法创建抽象实体。
    猜你喜欢
    • 1970-01-01
    • 2014-01-07
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    相关资源
    最近更新 更多