Entity framework 在DDD方法中首先使用EF代码时,如何正确定义DbContext派生类?

Entity framework 在DDD方法中首先使用EF代码时,如何正确定义DbContext派生类?,entity-framework,domain-driven-design,code-first,domain-model,Entity Framework,Domain Driven Design,Code First,Domain Model,我对EF、Code First和DDD还不熟悉,还在学习过程中,所以假设我有这样一个简单的领域 public class Customer { public string Name { get; set; } public string Address { get; set; } public List<Order> Orders { get; set; } } public class Order { public DateTime OrderD

我对EF、Code First和DDD还不熟悉,还在学习过程中,所以假设我有这样一个简单的领域

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; }
}
以及获取包含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();

        }
(注意,我没有测试这些查询,所以不确定它们是否有效,但它们描述了我的总体想法)

所以我想这是可行的,但我想知道这条路对吗。这里的查询可能会变得非常复杂,如果我将say Orders和Products添加到DbContext中,可能会更容易: 公共类MyContext:DbContext { 公共数据库集客户{get;set;} 公共数据库集命令{get;set;} 公共数据库集产品{get;set;} }

另一方面,我不确定我是否应该添加订单,因为它们已经可以从客户等处检索到


总而言之,在定义DbContext(以及相关的域模型)时,哪些是最佳实践?这些最佳实践应该由应用程序的特性(用例)驱动吗?在您的解释中,请随意使用和更改我上面示例中的代码。

请考虑为您的属性设置受保护的设置器。 否则,您可能会得到“数据实体”,而不是一个合适的域模型

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));
    }
}
        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();

        }
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));
    }
}