2015-04-05 129 views
4

我開始一個新的與實體框架的.NET MVC項目,我正在努力解決一些問題。ASP.NET MVC - DbContext的良好做法

  1. 在我的模型中,我有大約150個實體(從數據庫生成)。只有一個DbContext是個好主意嗎?如果不是,我應該如何劃分我的實體?

  2. 如果我有一個DbContext並創建一個實例化數據庫上下文對象(在Controller中)的類變量,那麼使用此DbContext會發生什麼?它是否在內存中爲每個實體創建單獨的空間?就我而言,當我有150個實體時,它不會很有效。我錯了嗎?

  3. 我將在許多控制器中使用我的DbContext。創建一個MainController(我創建新的DbContext)是一個好主意,它將由其餘的控制器繼承?因爲這允許其他人訪問相同的上下文。

  4. 處理我的DbContext的最佳做法是什麼?我讀過使用依賴注入是一個好習慣。但是通過這種方式,我將不得不爲每個控制器注入上下文。哪種依賴注入方式最流行並且現在被使用?

真的需要你的建議。這將使我對這一發展有更多的瞭解。

+0

你問過4個不同的問題,每個問題有足夠的內容來證明它自己的答案。因此,這個問題本身就是一個問題,過於寬泛。請考慮嘗試重新調整你的想法,稍微縮小這個範圍。參見[問] – Claies 2015-04-05 09:59:33

回答

1

150實體不是巨大的DbContext,但它大於EF開始在初始化第一個DbContext時出現性能問題的大小。如果您可以將您的實體邏輯分隔成責任區域(稱爲有界上下文),那麼您可以考慮使用多個DbContext。另外,你的應用程序是否需要使用所有這些實體?如果沒有,你可以簡化一些事情。另請注意,您至少需要EF6纔能有效地開展工作,以前版本的實體框架在多個上下文中存在問題。

您在使用多個上下文時也必須小心。許多人遇到麻煩是因爲他們從一個上下文中獲取實體,但隨後在另一個上調用保存更改,然後不明白爲什麼他們的更改未保存。或者,他們嘗試添加從一個到另一個檢索到的實體,這是你不能做到的。多個上下文使事情變得更加複雜,因此在分解之前確保你想要承擔這種複雜性。

不要擔心DbContext使用的內存量,只要您正確處理它。除非實際加載所有這些表中的對象,否則內存量將最小。

我認爲一個共同的基礎控制器是一個代碼味道。這通常是完全沒有必要的,而且通常最終會成爲您認爲想要共享的每一段代碼的傾倒地,這違反了單一責任主體。最重要的是,您不應該在控制器中進行數據訪問。您應該具有某種類型的業務層或業務層調用到數據訪問層。恰當地分隔你的顧慮是設計一個好的MVC應用程序的關鍵部分。

是的,依賴注入是一種很好的做法。我不確定你的意思是「必須注入我的所有控制器」。整個依賴注入的要點是注入你的依賴關係,因此「必須」的概念使你看起來像試圖避免你正在嘗試做的事情。

依賴注入是一個原則。實現這一原則的方法有很多種,您使用的方式完全取決於您自己的偏好和要求。我們不能告訴你什麼是「最好的」,除了確保遵循原則,而不是特定的技術。

+0

有沒有機會來展示如何將這項服務層的外觀和如何使用它? – Yoda 2015-04-06 11:11:00

+0

@Yoda,有大量的關於n層的MVC應用程序設計的問題,已經超出了問題的範圍。 – 2015-04-06 14:22:47

5
  1. 可以有一個DbContext。如果你有很多,你只需要確保你需要的所有實體存在於這個上下文中。例如,如果您從數據庫及其相關的Address檢索到Person,則PersonAddress必須存在於相同的DbContext中。

    我還沒有嘗試過使用多個DbContext實例,但有一點需要注意的是,如果在多個上下文中包含相同的表,最終可能會得到具有相似名稱或可能存在衝突的類。例如,如果在兩個上下文中包含Person,則每個上下文將嘗試創建一個名爲Person的類。

  2. 當您創建DbContext時,它只會爲您從數據庫檢索的數據創建對象。因此,如果您從Person表中請求一行,則只會創建一個Person對象。如果您請求100行,則會創建100個實例。

  3. 確實有兩種選擇。一,在每個動作中創建一個新實例,做好你的工作,然後保存它。或者,在您的構造函數中創建一個DbContext,並在整個課程中重新使用它。

  4. 這取決於您在第3點選擇的內容。如果你將它傳遞給構造函數,然後實現IDisposable並將其釋放。如果您在每個操作中創建一個新的操作,請確保使用using語句處理該操作。

對於依賴注入,有許多選項,教程等,如何在ASP.NET MVC中做到這一點。我個人使用Autofac和相關的MVC擴展,並將DbContext的新實例傳遞給每個控制器。

0

關於dbcontext問題: 我會去與多個dbcontext(有界上下文)。

單個大型dbcontext的一個問題是加載和初始化時間,因爲它會映射所有實體,當您的實體數量在您的上下文中增加時,這會增加。

現在您的項目必須包含模塊,您可以將大型dbcontext劃分爲小型數據庫上下文,以涵蓋每個單獨模塊需要與數據庫一起工作的所有內容,例如,假設您的項目有兩個模塊(成員和賬單或財務),你會發現,當你與會員模塊中的人打交道時,你需要他所有的細節,但不是他的發票的全部細節,當你與計費模塊中的人打交道時,你會需要他所有的發票都是deatils而不是他的全部個人信息,在這裏你可以爲每個模塊創建2個dbcontexts,其中個人實體包含該模塊需要的人員實體。

朱莉·勒曼有關於與實體框架的DbContext與開始的好文章,以獲得更多的細節什麼,我想在這裏說明, https://msdn.microsoft.com/en-us/magazine/jj883952.aspx

希望這有助於