[英]Entity Framework classes vs. POCO
我對建築設計有一般意見分歧,盡管不應該使用stackoverflow來征求意見,我想問兩種方法的優缺點,我將在下面描述:
詳細信息: - C#應用程序 - SQL Server數據庫 - 使用實體框架 - 我們需要決定使用哪些對象來存儲我們的信息並在整個應用程序中使用所有對象
場景1:我們將使用Entity Framework實體來遍歷我們的應用程序,例如,該對象應該用於存儲所有信息,我們將其傳遞給BL,最終我們的WepApi將獲取此實體並返回值。 沒有DTO和POCO。
如果數據庫模式發生更改,我們將更新實體並在使用它的所有類中進行修改。
場景2:我們創建一個中間類 - 稱之為DTO或稱之為POCO - 以保存應用程序所需的所有信息。 有一個中間步驟,即獲取存儲在實體中的信息並填充到POCO中,但我們將所有EF代碼保留在數據訪問范圍內,而不是跨所有層。
每個人的利弊是什么?
我有一個反問題:為什么不兩個?
考慮任何任意MVC應用程序。 在模型和控制器層中,您通常希望使用EF對象。 如果您在使用代碼首先,你已經基本上確定它們是如何在你的應用程序中使用它們定義,然后再設計你的持久層准確地保存在您的應用程序所需要的變化。
現在考慮將這些對象提供給View層。 視圖可能反映您的對象,也可能不反映您的工作對象的聚合。 這通常會導致POCOS / DTO捕獲視圖中所需的任何內容。 另一種情況是您希望在Web服務中發布對象。 許多框架提供了對poco類的簡單序列化,在這種情況下,您通常需要1)注釋您的EF類或2)制作DTO。
另請注意,當您使用POCOS或關閉上下文時,您在EF類上可能存在的任何延遲加載都將丟失。
我會使用中間類,即POCO而不是EF實體。
我看到直接使用EF實體的唯一優勢是它編寫的代碼更少......
改為使用POCO的優點:
基本上,假設您有一些GetUsers
業務方法。 如果你只想讓用戶列表填充一個網格(例如你需要他們的ID,名字,名字),你可以寫下這樣的東西:
public IEnumerable<SimpleUser> GetUsers()
{
return this.DbContext
.Users
.Select(z => new SimpleUser
{
ID = z.ID,
Name = z.Name,
FirstName = z.FirstName
})
.ToList();
}
很清楚你的方法實際返回的是什么。 現在想象一下,它返回了一個完整的User
實體,其中包含您不想公開的所有導航屬性和內部內容(例如Password
字段)......
對於像商業方法這樣的Create
更為明顯。 您當然不希望使用User
實體作為參數,對於您的服務的消費者來說,知道實際需要哪些屬性會非常復雜......
想象一下以下實體:
public class User
{
public long ID { get; set; }
public string Name { get; set; }
public string FirstName { get; set; }
public string Password { get; set; }
public bool IsDeleted { get; set; }
public bool IsActive { get; set; }
public virtual ICollection<Profile> Profiles { get; set; }
public virtual ICollection<UserEvent> Events { get; set; }
}
您需要哪些屬性來使用void Create(User entity);
方法?
是的,我討厭這個功能有多種原因。 他們之中有一些是:
使用POCO迫使您急切加載您的實體,更好的IMO。
AutoMapper是一個工具,允許您自動將實體轉換為POCO,反之亦然。 我也不喜歡它。 請參閱https://stackoverflow.com/a/32459232/870604
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.