2013-04-07 52 views
0

我有一個類表示對象A:EF腳手架基類成員

public class A 
{ 
    [Key] 
    private int _ID; 
    private string _property; 
    public ID {get {return _ID;} set {_ID = value;}} 
    public ID {get {return _property;} set {_property = value;}} 
} 

我腳手架這個類成DB如表使用EF A(添加遷移,更新數據庫)

我有另一個三個對象B,C,D具有類似屬性,所以我爲它們創建了一個基類。從它

public class Base_B_C_D 
{ 
    [Key] 
    protected int _ID; 
    protected string _prop; 
    protected List<A> A_List; 
    public ID {get {return _ID;} set {_ID = value;}} 
    public ID {get {return _prop;} set {_prop = value;}} 
} 

和繼承B,C,d:所有這些對象必須包含類型A的對象的列表,以便創建參照甲

public class B:Base_B_C_D {} 
public class C:Base_B_C_D {} 
public class D:Base_B_C_D {} 

當我腳手架B,C, D到DB使用EF我沒有看到任何表中的任何FK,並且沒有鏈接之間A和B,C,D ...

問題是:什麼是正確的方式如何搭建這樣的鏈接? 在此先感謝!

回答

0

只有幾個型號,你應該使用table-per-type inheritance。您還應該爲您的POCO使用auto-implemented properties。在屬性訪問器中不需要額外的邏輯時應該使用它們。

如果B,CD包含與A類似的屬性,它們應該從它繼承。如果B,CD必須包含對象列表A,則此關係表示爲一對多關係。這在EF中使用ICollection表示,它將作爲FK。

根據您的車型,您可以實現TPT繼承這樣的:

public class A 
{ 
    [Key] 
    public int ID { get; set; } 
    public string Property { get; set; } 
} 

[Table("B")] 
public class B : A 
{ 
    // more properties... 

    // 1:Many with A 
    public ICollection<A> CollectionA { get; set; } 
} 

[Table("C")] 
public class C : A 
{ 
    // more properties... 

    // 1:Many with A 
    public ICollection<A> CollectionA { get; set; } 
} 

[Table("D")] 
public class D : A 
{ 
    // more properties... 

    // 1:Many with A 
    public ICollection<A> CollectionA { get; set; } 
} 

在你的上下文類,你只能創建類型的基類的一個DbSet:

public class MyDbContext: DbContext 
{ 
    public DbSet<A> Person { get; set; } 
} 

的某處你應用程序創建派生類的實例:

using(var db = new MyDbContext()) 
{ 
    var b = db.A.Create<B>(); 
    // ... same for C and D 
    db.A.Add(b); 
    db.SaveChanges(); 
} 
+0

此方法僅適用於B,C和D具有與BASE_B_C_D具有完全相同的屬性,但是如果它們實現了更多屬性(如您所寫),那麼這些屬性將被存儲在哪裏,因爲我們只有一個具有BASE_B_C_D屬性列的DbSet?當我在B或者С或者D中包含List 時,我知道出現在A中的abuot FK ...但是如果我必須在每個派生類中包含List ,那麼在那種情況下繼承是什麼?我們的目標是在BASE_B_C_D中包含List ,而不是在B或C或D中重寫它,而只是通過繼承來使用 – versus 2013-04-07 13:21:48

+0

當使用TPT繼承時,我們只在類型基類的DbSet上創建。使用[Table(「...」)]註釋派生類將爲數據庫中的每個派生類創建表,其中列將直接映射到派生類中的屬性,即,這是存儲其他屬性的位置。我不太確定FK是否可以通過繼承按照您描述的方式在EF中實現 - 我總是創建一個集合來表示「多」FK。繼承允許重用代碼並在類之間創建is-a關係。 – MattSull 2013-04-07 13:40:23