2017-05-02 208 views
0

我試圖學會使用實體框架,並通過實體框架食譜6書(甚至不試圖隱藏)。
工作2-4:
3個表:
訂購:訂單,訂購日期,(NAV屬性的OrderItems)
OrderItem的:的OrderId,SKU數(淨值屬性,項目,定單)
項:SKU,說明,價格(NAV屬性的OrderItems)實體框架6多對多

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

至少現在我知道在他們的代碼向前得到它的工作改變。謝謝!!

回答

0

你從來沒有真正將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 
    }); 
+0

謝謝,這可能是我收到過的最糟糕的一本書了,自從VB 5發佈以來,我一直在閱讀它們。似乎他們留下了一些「重要」的事情。 – DRouleau

+0

我忘了提及,我喜歡內聯的想法,可能我會如何去做。再次感謝。 – DRouleau

0

這是不是真正的多對多,但有關EF 如何發現相關數據的方式。

您需要明確地將條目添加到數據庫,即實際引用相關數據。在你的情況,這是oi,因此,如果您將其添加

context.OrderItems.Add(oi); 
context.SaveChanges(); 

相關io.Orderio.Item將EF考慮。但是當您僅提供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(); 
+0

謝謝,我也會嘗試。就像我上面所說的那樣,一段時間以來我用過的最糟糕的書。 – DRouleau

0

您必須添加一個條目在數據庫上適當的數據被調用。在這種情況下,這是OI。