2014-09-25 78 views
1

我有一個簡單的TPT繼承,EF 6.1.1EntityFramewok TPT繼承

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。

我真的不明白第4點。如何在派生表中插入一條記錄而不在基表中插入新記錄? 我認爲問題與身份列有關。看起來插入EF時不關心Derived類的Id,因爲Id屬性有HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity),但我不能在Base和Derived類中指定不同的DatabaseGeneratedOption屬性。

回答

1

這是預期的行爲。如果沒有Base實體,則不會存在Derived實體。

如果要插入Derived實體至極IdBase表,EF插入一個新的元組BaseDerived,在Derived表寫在基表IdSomeProperty。任何其他行爲都會導致數據損壞和不一致。

如果你正在嘗試的是從現有的Base創建一個Derived只需按照此link並閱讀了一下。

+0

是的,我是triyng從現有的'基地'創建一個'派生',你發佈的鏈接解釋說,EF不支持。我認爲這是一個強大的限制,使TPT繼承不那麼有用。在我看來,創建存儲過程來插入派生自Base的東西是瘋狂的。 – Marco 2014-09-26 13:03:46

+0

同意你Marco – jlvaquero 2014-09-28 22:35:09

相關問題