我新的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