我有一个简单的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; }
}
现在,
我真的不明白第4点。如何在派生表中插入记录而不在Base表中插入新记录?
我认为这个问题与身份栏有关。似乎在插入EF时并不关心Derived类的Id,因为Id属性有HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
,但我无法在Base和Derived类中指定不同的DatabaseGeneratedOption属性。
答案 0 :(得分:1)
这是预期的行为。没有Derived
实体,Base
实体不能存在。
如果您要插入Derived
实体Id
不在Base
表中,则EF会在Base
和Derived
中插入一个新元组,写作基表中的Id
和SomeProperty
表中的Derived
。任何其他行为都会导致数据损坏和不一致。
如果你正在尝试从现有Derived
创建Base
,请按照此link阅读一下。