我新的EF,代码第一次和DDD,仍然在学习的过程,让我们说我有这样的如何在使用EF代码优先和DDD方法时正确定义DbContext派生类?
public class Customer
{
public string Name { get; set; }
public string Address { get; set; }
public List<Order> Orders { get; set; }
}
public class Order
{
public DateTime OrderDate { get; set; }
public List<LineItem> LineItems { get; set; }
}
public class LineItem
{
public Product Product { get; set; }
public int Quantity { get; set; }
}
public class Product
{
public string Name { get; set; }
public decimal Price { get; set; }
}
简单的域域定义的下一个步骤之后是创建的DbContext派生类和我问题是它应该是什么样子?由什么驱动的上下文类定义?它是由最终的应用程序的用例吗?
例如,查看上面的域,我们可以看到,给定Customer实例,我们可以访问任何子对象。那么,这则足以使上下文类仅包含客户属性是这样的:
class MyContext : DbContext
{
public DbSet<Customer> Customers { get; set; }
}
有了这个,我可以从我的应用程序浏览客户,然后选择一个来查看详细信息和订单历史等..看起来不错目前。
现在,让我们说,我想按照我的应用程序的功能: - 在其列表与特定产品的所有订单
我想,这个数据 - 列表最后10章店(不管谁是客户) 可以从当前的上下文中拉出来吗?例如。去年10章:
using (var context = new MyContext())
{
var lastTenOrders = context.Customers.Include("Orders")
.Select(customer => customer.Orders)
.SelectMany(orderList => orderList)
.OrderByDescending(order => order.OrderDate)
.Take(10)
.ToList();
}
并获得包含产品使用id = 5的所有订单:
using (var context = new MyContext())
{
int productId = 5;
var lastTenOrders = context.Customers.Include("Orders")
.Select(customer => customer.Orders)
.SelectMany(orderList => orderList)
.Where(order => order.LineItems.Where(i => i.Product.Id == productId).Any())
.ToList();
}
(注意我没有测试这些查询所以不知道如果他们的工作,但他们描述我一般想法)
所以我想这会工作,但我想知道这是正确的道路。查询在这里可能会非常复杂,如果我将订单和产品添加到DbContext中,它可能会更容易: public class MyContext:DbContext { public DbSet Customers {get;组; } public DbSet Orders {get;组; } public DbSet Products {get;组; }}
在另一方面,我不知道我是否应该增加的订单,因为他们已经可以从客户等检索...
概括起来讲,什么是确定的DbContext(当最佳实践和领域模型),并且应该由应用程序的功能(用例)驱动?在你的解释中,在上面的示例中随意使用和更改代码。
+1 DTO不是域实体。 – jgauffin