@ jrummell只是部分正確。實體框架將爲每個DbContext類型創建一個數據庫,如果您將它留給它自己的設備。使用@NeilThompson從Julie Lerhman提到的「有界上下文」的概念,你所做的只是告訴每個上下文實際使用相同的數據庫。朱莉的方法使用一個通用的模式,使每個實現它的DbContext在同一個數據庫結束了,但你可以爲每一個,它看起來像做手工:
public class MyContext : DbContext
{
public MyContext()
: base("name=DatabaseConnectionStringNameHere")
{
Database.SetInitializer(null);
}
}
換句話說,朱莉的方法只是套建立一個基類,使得每個上下文都可以從該基類繼承,並自動處理該片段。
這樣做有兩件事:1)它告訴你的上下文使用特定的數據庫(即,,與其他上下文相同); 2)它告訴你的上下文禁用數據庫初始化。最後一部分很重要,因爲這些上下文現在基本上被視爲數據庫優先。換句話說,您現在沒有任何可以實際創建數據庫的上下文,或者表示需要發生遷移。因此,您實際上需要另一個「主」上下文,該上下文將在您的應用程序中包含每個實體。不過,除了創建遷移和更新數據庫外,您無需使用此上下文。對於你的代碼,你可以使用更專門的上下文。
需要特別注意的另一件事情是,每個上下文的每個實例都代表一個獨特的狀態,即使它們共享實體。例如,來自一個上下文的Cat
實體是而不是與第二個上下文中的Cat
實體相同,即使它們共享相同的主鍵。如果您從第一個上下文中檢索到Cat
,則會發生錯誤,對其進行更新,然後嘗試通過第二個上下文進行保存。這個例子有點做作,因爲你不可能在兩個不同的上下文中顯式地擁有相同的實體,但是當你進入外鍵關係時,遇到這個問題更爲常見。即使您沒有爲相關實體明確聲明DbSet
,但上下文中的實體依賴於該實體,EF會爲其隱式創建一個DbSet
。所有這一切都是說,如果你使用專門的上下文,你需要確保它們是真正專業化的,並且在任何相關項目級別都有交叉。
謝謝你,你的回答是關鍵的。不幸的是,我僅限於爲我的應用程序使用一個數據庫。據我的理解,這意味着我不得不使用一個'DbContext'類型,對嗎? –
不,情況並非如此 –
不,這只是默認約定。如果你的每個上下文有相同的連接字符串,它應該工作。但是,如果要使用遷移,則每個上下文都需要一個單獨的數據庫。 – jrummell