2011-09-27 50 views
1

我有一個叫做TypeA的類型,並且在TypeA的某個地方有TypeB(其中除IDString之外沒有任何東西)的屬性。手動添加DbSet或允許自動創建表格有什麼區別?

使用實體框架,我創建了DbSetTypeA - public DbSet<TypeA>

這會在數據庫中的TypeB列就好了 - 不過,我現在需要填入一些數據。由於原始DbContext中不存在TypeB,因此我無法向其播種數據。

因此,我將public DbSet<TypeB>添加到我原來的DbContext,它甚至沒有檢測到數據庫模式中的更改/差異。

所以,這讓我想知道,我的問題是,是否有建立在一個單獨的DbSet是自動的關係產生什麼區別?

示例代碼

public class TypeA 
    { 

     public int id { get; set; } 


     public string name { get; set; } 


     public TypeB foo { get; set; } 
    } 

    public class TypeB 
    { 
     public int ID { get; set; } 

     public string name { get; set; } 
    } 

回答

1

是的,是有區別的。

在外觀設計方面,所述DbSet類的點是to embody the Repository pattern

從概念上講,資源庫封裝在數據存儲持久對象的集合和對它們執行的操作,提供了一個更加面向對象的持久層的視圖。 Repository還支持在域和數據映射層之間實現乾淨的分離和單向依賴的目標。

其目的是爲給定的實體封裝CRUD。爲了做到這一點,存儲庫不能僅限於一個表。有時它必須與數據庫中的對象樹一起工作。

在你的情況,有兩種類型的一個DbSet會給你一個倉庫直接訪問該實體。這將允許您直接在數據庫中查詢TypeB或者直接創建/更新TypeB實例,而不是總是要永遠剷除您的疑問在TypeA

一些這取決於你的協會,雖然。如果你對TypeB有一個約束,需要一個TypeA,那麼你不能在沒有TypeA的情況下創建它們。但是,您仍然可以直接查詢它們。

仍然可以創建或更新TypeB情況下沒有DbSet<TypeB> - 只需連接一個到TypeA實例和工作對的DbSet<TypeA>

+0

這是偉大的,謝謝你 - 正如我所說的,我是不是能夠種子數據(外將其定義在'TypeA'的),但是,我創建了'DbSet'後,我能夠創建種子數據就好了。所以基本上,除了能夠直接訪問數據外,您還說「內部」有什麼差別? ......當它沒有觸發更新/檢測模式更改時,我只是被拋出。 – Wil

+1

@William:沒錯:)如果你在一個複雜類型的實體上定義了一個屬性,那麼這個數據必須去某個地方。 'DbSet '知道這一點,並創建它需要的表格(以及可能的約束)。 –

+0

輝煌 - 謝謝! +1並回答。 – Wil

相關問題