簡體   English   中英

實體框架6多對多

[英]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.Orderio.Item 但是,當您僅提供order而不提供從orderio導航信息時,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM