[英]Bounded (Db)Contexts in Entity Framework Architecture
我剛看過Julie Lermans關於在EF中使用有界上下文的視頻(http://www.pluralsight.com/training/Courses/TableOfContents/efarchitecture),我現在正試圖找出實現它的最佳方法(使用POCO) 。 我看到的兩個選項是要么有一個edmx模型定義所有內容,然后手工繪制DbContexts以包含適當的實體,或者為每個上下文分別使用edmx模型並使用自動創建的DbContexts。
有沒有人認為哪個是最好的或任何利弊?
恕我直言:對於單個模型,它是更少的類和更多的代碼重用(盡管這些類是自動創建的,所以實際上它只是手動復制的額外功能),但我會有很多在一個地方的課程和需要專業的課程,每個課程都必須有不同的名稱。 例如Customer,CustomerForFunctionalityX,CustomerForFunctionalityB。
對於單獨的模型,我可以對進入上下文的內容更嚴格,因為刪除屬性不需要是一個全新的實體,並且我可以根據需要命名所有內容(即,即使所有模型都可以使用Customer對象)它在模型之間有所不同),但是現在每個上下文都有完全不同的實體,即使它們都只是映射到同一個表 - 這也使得在上下文之間傳遞它們變得更加困難(但是這不應該經常需要,否則它不需要它意味着上下文已被定義為錯誤)。
我也在嘗試有限的上下文,並遇到了一個(小?)問題的模式。 我最初創建了兩個上下文,一個用於域數據,一個用於審計類型數據(實體更改審計信息和進程信息)。 最初,我發現數據庫只從一個上下文創建表而忽略了另一個上下文。 我假設從基礎上下文中派生出兩個上下文,
public class BaseContext<TContext> : DbContext where TContext : DbContext
會生成完整的數據庫,但似乎沒有這樣做。
解決此問題的一種方法是創建一個引用所有實體的“主”上下文,但不將其公開給模型。 這工作正常,但現在db模式存在一個小問題。
由於我們的支持人員使用SSMS來調試系統,我認為以與有界上下文相同的方式更改模式是個好主意,所以我在主上下文中指定了模式(OnModelCreating()覆蓋方法與主服務器上下文):
modelBuilder.Entity<Address>()
.HasKey(b => new {b.AddressId,b.EffectiveStartDate})
.ToTable("Addresses", "Esr");
其中“Esr”是架構。 但是,在嘗試使用有界上下文寫入數據時,會發生錯誤,指示有界上下文使用“dbo”架構。 我相信這有辦法解決這個問題。 我確實有一種嘮叨的感覺,這可能不值得所有的努力。
當然,有界的上下文給應用程序帶來了更清晰的感覺,我喜歡構造代碼以適應域結構的想法,因為這使整體架構更接近規范並且在考慮測試時有所幫助。
另一方面,我的同事程序員在編寫單個整體上下文時是否會在選擇正確的實體時遇到麻煩?
當應用於支持或UAT領域時,上下文的分離更有用,並且這些人必須在整個業務流程方面使用應用程序。
我們現在正在討論這個確切的問題,我也觀看了Julies視頻以及研究DDD。 我希望我的數據訪問能夠反映工作單元,但我們遇到的問題是表名不能用於多個EDMX。
假設我有表Customer,CustomerOrder,Order,OrderInventory,Item。 在一個屏幕上,我只想顯示客戶信息,因此我的EDMX只有客戶。 現在另一個用例是我為客戶開發的所有發票,在這個用例中我有Customer,CustomerOrder,Order,OrderInventory和Item。 我們得到了這個例外:CLR類型到EDM類型的映射是不明確的,因為多個CLR類型與EDM類型“Customer”匹配。 以前發現CLR類型'A.Customer',新發現的CLR類型'B.Customer'。
你們是如何解決這個錯誤信息的? 您是否重命名在所有EDMX文件中重復的每個表?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.