实体框架TPT继承

时间:2014-09-25 10:35:50

标签: c# entity-framework

我有一个简单的TPT继承,EF 6.1.1

public class Base {
    public int Id {get; set;}
}

public class Derived : Base {
     public int SomeProperty {get; set;}
}

请注意,在我的情况下,Base不是抽象类,因为在我的域中可以存在Base不带Derived的实例。 DbContext:

public class ApplicationDbContext : DbContext {

   protected override void OnModelCreating(DbModelBuilder modelBuilder) {
       base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<Derived >().ToTable("Derived");
   }

   public DbSet<Base> BaseDbSet {get ; set; }
   public DbSet<Derived> DerivedDbSet {get ; set; }
}

现在,

  1. 我可以在BaseDbSet中插入。
  2. 我可以从BaseDbSet中删除。
  3. 从DerivedDbSet删除仅删除派生实体。
  4. 在DerivedDbSet中插入基表中的新记录,如果Id正确,则创建新的Id。
  5. 我真的不明白第4点。如何在派生表中插入记录而不在Base表中插入新记录? 我认为这个问题与身份栏有关。似乎在插入EF时并不关心Derived类的Id,因为Id属性有HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity),但我无法在Base和Derived类中指定不同的DatabaseGeneratedOption属性。

1 个答案:

答案 0 :(得分:1)

这是预期的行为。没有Derived实体,Base实体不能存在。

如果您要插入Derived实体Id不在Base表中,则EF会在BaseDerived中插入一个新元组,写作基表中的IdSomeProperty表中的Derived。任何其他行为都会导致数据损坏和不一致。

如果你正在尝试从现有Derived创建Base,请按照此link阅读一下。