最近,我們的EF架構已經遷移到此。我正在尋找關於如何最好地改變它(或不是)的建議。數據架構
我們有一個「數據」項目,該項目包含了我們DataModel.EDMX文件,它返回我們的實體對象一個Context.cs類一起:
public static DataModelEntities getContext() {
return new DataModelEntities();
}
然後,我們創建一個「業務」項目,該項目包含近EF生成的類的副本。例如,如果我們有一個客戶表,我們創建了一個CustomerBO類來保存屬性:
public class CustomerBO {
public int customerId {get;set;}
public string firstName {get;set;}
public string lastName {get;set;}
public int orderCount {get;set;}
}
我們在理論上可以使用由EF創建Customer類,但我們不這樣做,因爲它通常包含如果我們最終將其序列化並通過網絡傳遞,則會有很多額外的東西。
在我們的CustomerBO類中,我們有檢索/保存數據的方法。例如,getCustomerList方法:
public static List<CustomerBO> getCustomers() {
using (var context = Context.getContext()) {
var lst = from c in context.Customers
select c;
// Wrap the EF results to a List<Customer>
return toCustomerList(lst);
}
}
/// Wraps a queryable object to a List<Customer>
private static List<CustomerBO> toCustomerList(IEnumerable<Customer> queryCustomerData) {
var data = from c in queryCustomerData
select new CustomerBO() {
customerId = c.customerId,
firstName = c.firstName,
lastName = c.lastName,
orderCount = c.CustomerOrders.Count()
};
return data.ToList();
}
我們始終確保使用toCustomerList方法將所有數據返回到GUI。它向我們保證會設置任何自定義屬性,如orderCount,並且不要求開發人員記住將這些自定義屬性添加到主EF查詢中。
總的來說,設計是堅實的,並已解決了多年來我們碰到的許多問題。但是,有一個特別的問題困擾我。我們稱之爲「業務」層,但我們在其中有一些「查詢」邏輯。有沒有更好的方法來設計這個模式,以符合既定的模式,並仍然達到相同的結果?
因此,當我使用CustomerRepository時,基本上是將getCustomers()方法從我的DTO類移出到CustomerRepository類中 - 仍然是靜態方法?我有興趣瞭解更多關於你對Iqueryable/ICollection觀點的信息 - 你知道一篇好文章嗎? – bugfixr 2010-12-09 22:59:08