0

我新的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(当最佳实践和领域模型),并且应该由应用程序的功能(用例)驱动?在你的解释中,在上面的示例中随意使用和更改代码。

回答

2

考虑受保护的setter为您的属性。 否则,你可能会以'数据实体'而不是一个合适的域模型结束。

public class Customer 
{ 
    public string Address { get; protected set; } 

    public MoveTo(string newAddress) 
    { 
     if (newAddress == null) throw new ArgumentNullException("newAddress"); 
     // and other address sanity checks.. 

     Address = newAddress; 
     DomainEvent.Publish(new CustomerMoved(CustomerNumber, newAddress)); 
    } 
} 
+0

+1 DTO不是域实体。 – jgauffin