【发布时间】:2012-07-03 10:41:47
【问题描述】:
我在分层架构中使用实体框架 POCO。获得实体(y/ies)后,我们应该断开连接工作。
假设我们有两个实体:
public class Customer
{
public int Id;
public string Name;
public virtual IList<Order> Orders;
}
public class Order
{
public int Id;
....
}
假设有一位客户的订单数为 1000。
在这种情况下,我们希望在服务方法中获取该客户仅在本周完成的订单。
Repository 方法和Service 方法应该如何?
编辑
我想我应该扩展我的问题。
首先,我的意思是“有 1000 个订单的客户”,我不想得到那个客户。我想获取“Order.Date > DateTime.Now.AddDays(-7) 的客户订单(具有已知 ID,假设 Customer.Id=5)”。
表示 IQueryable 对象很容易。
public List<Order> GetOrdersInLastWeek(int CustomerId)
{
Customer customer = (from c in ctx.Customers where c.Id == CustomerId).SingleOrDefault();
List<Order> ordersThatIWant = customer.Orders.Where(o => o.Date > DateTime.Now.AddDays(-7)).ToList();
return ordersThatIWant;
}
我很好奇这些:上面的代码运行良好。
- 但是,对于 ORM/N-Layer 最佳实践是否正确?因为 Order 不是“聚合根”,所以 Customer 是“聚合根”。
- 我是否必须在 CustomerService 类或 OrderService 类中拥有这个 GetOrdersInLastWeek?
- 对我来说最后也是最重要的一个;如果我有像 GetOrdersInLastWeek 这样的方法,以及像这样的其他方法,那么其他层(例如表示层)中的“Customer.Orders”导航属性呢(假设我们正在使用 POCO 实体并断开连接)?
- 另一个例子;我想在服务方法中对 Customer.Orders 导航属性进行分页。我如何以及在哪里可以做到这一点(我知道怎么做,但我的意思是根据最佳实践)?
【问题讨论】:
-
“其他层中的“Customer.Orders”导航属性怎么样”是什么意思?
-
我不使用额外的 DTO 将 POCO 转换为 UI 层。因此,UI 层看到了 Customer 类的 Orders 导航属性。但是我会在 OrderService 类中对 Orders 进行每个查询,因此在这种情况下,Customer.Orders 在 UI 层中是无用的。这是正确的方法吗?
-
我不能说它是否正确。我不明白您为什么不加载客户包括您在 UI 层中需要的订单(如下面的示例)?对于其他点,我在下面编辑了我的答案(请参阅“编辑”部分)。
标签: entity-framework orm entity-relationship