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