最近,我们的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