2013-04-12 23 views
5

我正在學習ASP.NET MVC,我有一些問題,直到現在我讀過的教程還沒有以涵蓋我的方式進行探索。我試過搜索,但我沒有看到任何問題。不過,請原諒我,如果我錯過了現有的。我應該有多少個DbContext子類,與我的模型有關?

如果我有一個ASP.NET MVC應用程序有多個模型(其中一些相互關聯而另一些不相關),我應該創建多少個DbContext子類,如果我想使用一個連接字符串一個數據庫全球爲我的應用程序?

  • 每個模型都有一個上下文?
  • 每個相關模型組的一個上下文?
  • 所有模型的一個上下文?

如果答案是前兩個中的一個,那麼有什麼我應該考慮,以確保只有一個數據庫是整個應用程序創建的?我問,因爲在Visual Studio中進行本地調試時,它在我看來像創建與上下文一樣多的數據庫。這就是爲什麼我找到自己使用第三種選擇的原因,但我想知道這是否是正確的做法,或者我是否犯了某種錯誤,以後會再回來咬我。

回答

4

@ 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。所有這一切都是說,如果你使用專門的上下文,你需要確保它們是真正專業化的,並且在任何相關項目級別都有交叉。

0

通常,每個數據庫應該有一個DbContext。但是,如果你有獨立的,不相關的模型組,那麼分開實現DbContext是有意義的。

它看起來像我創建儘可能多的數據庫,因爲有 上下文。

這是正確的,實體框架將創建一個數據庫每個DbContext類型。

+0

謝謝你,你的回答是關鍵的。不幸的是,我僅限於爲我的應用程序使用一個數據庫。據我的理解,這意味着我不得不使用一個'DbContext'類型,對嗎? –

+0

不,情況並非如此 –

+0

不,這只是默認約定。如果你的每個上下文有相同的連接字符串,它應該工作。但是,如果要使用遷移,則每個上下文都需要一個單獨的數據庫。 – jrummell

5

我用什麼朱莉·勒曼調用Bounded Context

SystemUsers代碼可能無關Products - 所以我可能有一個系統的DbContext和一個店鋪的DbContext(例如)。

在小應用程序中使用單個上下文可以讓生活更輕鬆,但對於更大的應用程序,它有助於打破上下文。

+0

謝謝。我正在尋找這樣的概念。 –

相關問題