7

我正在開發我的第一個.NET項目(.NET 3.5,ADO.NET和C#)。我們已經構建了我們的實體模型,並試圖構建一個乾淨的業務對象層。將業務層添加到ADO .NET Entity Framework

我們已經有了我們的基本實體模型,我們希望將某些業務級語義添加到默認數據訪問器(導航屬性等)。

例如,假設我們在PersonBankAccounts之間存在多對多關係。我們假設在業務層,我們希望添加凍結帳戶的功能。現在,我們希望從一個人轉到能力:

  • 所有的銀行賬戶,
  • 其非凍結銀行賬戶,並
  • 其凍結的銀行賬戶。

當然,我們希望使名義大小寫成爲默認值:如果我瀏覽Person.BankAccounts(),我希望它返回其非凍結帳戶。我可以添加導航屬性Person.FrozenBankAccounts()Person.AllBankAccounts()

我們提出的兩種方法似乎都有相當的代碼味道。

  1. 我們無法找到覆蓋實體模型方法的方法。因此,請將Person.BankAccounts()作爲返回所有銀行帳戶的訪問者。然後我們添加一個Person.FrozenBankAccounts()和一個Person.NonFrozenBankAccounts()
  2. 向代碼庫添加另一個顯式圖層,將所有訪問包裝爲BankAccounts

對於方法1,問題在於名義商業案例(訪問解凍的銀行賬戶)是該批次中最不直觀的方法名稱。

在方法2中,當我們從實體模型層中對對象進行子類化時,我們必須重寫每個方法以確保它不會從底層返回對象。因此,我們創建一個BL_Person,其中有一個BankAccounts()方法,該方法返回BL_BankAccount對象的集合。但在這種情況下,所有的代碼似乎有點傻。

有沒有比我們考慮過的更好的方法?如果沒有更好的方法,我概述的兩個中哪一個似乎是更好的解決方案(鑑於我們有類似50+的課程,我們需要合作)?

注:雖然做網絡搜索,我找到了一封公開信給微軟名爲ADO .NET Entity Framework Vote of No Confidence這似乎暗示有沒有在一個清晰的關注分離添加的好方法。

回答

-3

溝渠EF支持NHibernate

NHibernate的方式是:你創建業務對象,你告訴NHibernate如何將這些業務對象保存到數據庫中。業務對象本身具有如何保存或加載或者正在使用NHibernate的知識。這被稱爲「持久性無知」。另外,你可以告訴NHibernate以任何你喜歡的方式保存和加載你的業務對象。它對你描述的場景有很好的支持。

停止寫入數據訪問層並停止代碼生成它們。使用real man's ORM

+0

好的方法,但是,它也可以用EF4來實現。 – 2011-04-11 20:53:54

4

我沒有LINQ to Entities的經驗,但你的問題響了。在我上一個項目中,我遇到了另一個ORM幾乎相同的問題。我沒有讓業務對象層的客戶直接使用ORM生成的類或複製所有類並實現大量轉發功能,而是定義了接口。

  • 在直線前進的情況下(沒有業務邏輯),發展開銷的接口:業務對象層將只能看到這些接口和你的實體類會實現這些接口,具有以下優點的客戶是最小的。對於大多數成員,您不需要實現轉發功能,只需從界面「派生」實體類並完成它即可
  • 如果您提到,在界面中可以有一個屬性BankAccounts並通過顯式接口實現讓它轉發給實施實體的NonFrozenBankAccounts。你當然也可以添加任何你想
  • 作爲一個額外的好處檢查,你可以輕鬆無明顯改變任何客戶端代碼來做到這一點會像
0

一種方式交換底層持久層所以:

  1. 定義您的AllBankAccounts屬性(甚至可能使其私人)。
  2. 定義部分Person類中的BankAccounts屬性。該屬性可以在AllBankAccounts方面使用LINQ來表示,即AllBankAccounts.Where(A =>!a.IsFrozen)
  3. 定義FrozenBankAccounts屬性在部分Person類等步驟2.

希望幫助。

1

您可以添加從帳戶
繼承了兩個新的實體類型 - RegularAccount和FrozenAccount
並添加您的isFrozen字段作爲繼承條件(表每一個分層)。

然後,你可以從「人」到「帳戶」刪除該協會,並創建兩個新的協會:對人「帳戶」

人到RegularAccount,名稱導航屬性。

Person to FrozenAccount,名稱導航屬性上的人「FrozenAccounts」。