[英]Entity Framework 6 Many to many
我正在嘗試學習使用Entity Framework,並且正在研究Entity Framework Recipes 6 Book(甚至不會嘗試隱藏它)。
在2-4上工作:
3張桌子:
訂單:OrderID,OrderDate(導航屬性OrderItems)
OrderItem:OrderId,SKU,計數(導航屬性,項目,訂單)
項目:SKU,描述,價格(導航屬性,OrderItems)
using (var context = new EFRecipesContext()) {
var order = new Order { OrderId = 1, OrderDate = new DateTime(2010, 1, 18) };
var item = new Item { SKU = 1729, Description = "Backpack", Price = 29.97M };
var oi = new OrderItem { Order = order, Item = item, Count = 1 };
item = new Item { SKU = 2929, Description = "Water Filter", Price = 13.97M };
oi = new OrderItem { Order = order, Item = item, Count = 3 };
item = new Item { SKU = 1847, Description = "Camp Stove", Price = 43.99M };
oi = new OrderItem { Order = order, Item = item, Count = 1 };
context.Orders.Add(order);
context.SaveChanges();
}
唯一添加到數據庫的是順序,沒有別的,沒有項目,等等...我在前面的示例中遇到了問題,不得不單獨添加“其他”項目,但我認為這一點是您可以只做一個“添加”,它將所有對象添加到數據庫中?
提前致謝!
UPDATE
好的,我根據以下建議進行了以下更改,現在可以正常工作了
using (var context = new EFRecipesContext()) {
var order = new Order { OrderId = 1, OrderDate = new DateTime(2010, 1, 18) };
var item = new Item { SKU = 1729, Description = "Backpack", Price = 29.97M };
var oi = new OrderItem { Order = order, Item = item, Count = 1 };
order.OrderItems.Add(oi); // suggestion from Stackoverflow.
item = new Item { SKU = 2929, Description = "Water Filter", Price = 13.97M };
oi = new OrderItem { Order = order, Item = item, Count = 3 };
order.OrderItems.Add(oi); // suggestion from Stackoverflow.
item = new Item { SKU = 1847, Description = "Camp Stove", Price = 43.99M };
oi = new OrderItem { Order = order, Item = item, Count = 1 };
order.OrderItems.Add(oi); // suggestion from Stackoverflow.
context.Orders.Add(order);
context.SaveChanges();
}
至少現在我知道他們將在代碼中進行哪些更改以使其正常工作。 謝謝!!
您實際上從未將OrderItems添加到DbContext集合中。
您的代碼也存在問題,這意味着您要多次覆蓋項目和oi變量值。
下面的代碼做了一些假設,因為您沒有提供更多的代碼,但是應該很容易適應。
using (var context = new EFRecipesContext()) {
var order = new Order { OrderId = 1, OrderDate = new DateTime(2010, 1, 18) };
context.Orders.Add(order);
var item1 = new Item { SKU = 1729, Description = "Backpack", Price = 29.97M };
var oi1 = new OrderItem { Order = order, Item = item, Count = 1 };
context.OrderItems.Add(oi1);
var item2 = new Item { SKU = 2929, Description = "Water Filter", Price = 13.97M };
var oi2 = new OrderItem { Order = order, Item = item, Count = 3 };
context.OrderItems.Add(oi2);
var item3 = new Item { SKU = 1847, Description = "Camp Stove", Price = 43.99M };
var oi3 = new OrderItem { Order = order, Item = item, Count = 1 };
context.OrderItems.Add(oi3);
context.SaveChanges();
}
除非再次使用變量,否則還可以像下面這樣內聯地定義對象,這將減少重復性:
context.OrderItems.Add(new OrderItem {
Order = order,
Item = new Item {
SKU = 1729,
Description = "Backpack",
Price = 29.97M
},
Count = 1
});
這實際上並不是很多,而是關於EF如何發現相關數據的方式。
您需要明確地將條目添加到數據庫,即實際上是在引用相關數據。 就您而言,這是oi
,所以如果您添加它
context.OrderItems.Add(oi);
context.SaveChanges();
EF將考慮相關的io.Order
和io.Item
。 但是,當您僅提供order
而不提供從order
到io
導航信息時,EF無法了解這種關系。
解決該問題的另一種方法(而不是顯式添加io
)是在保存之前更新order.OrderItems
:
oi = new OrderItem { Order = order, Item = item, Count = 1 };
order.OrderItems.Add(oi);
context.Orders.Add(order);
context.SaveChanges();
您必須將一個條目添加到數據庫以對適當的數據進行調用。 在這種情況下,就是OI。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.