2013-04-09 4 views
0

У меня есть следующий код для обновления некоторых значений инвентаризации ...Entity Framework SaveChanges() не работает EF5, .Net4

private static void UpdateInventory(int prodId, int qty) 
    { 
     using (var context = new uStore7_1Entities()) 
     { 
      //Get the catalogNo and ProductUnitID of the product passed in so we can find all identical products that might just be boxed differently 
      var currProdItem = context.Products.Where(c => c.ProductID.Equals(prodId)) 
             .Select(c => new {c.CatalogNo, c.ProductUnitID}).FirstOrDefault(); 

      //Get the units per box factor for calculating total product ordered 
      var prodIdAmount = 
       context.ProductUnits.Where(pa => pa.ProductUnitID.Equals(currProdItem.ProductUnitID)) 
         .Select(pa => pa.Amount) 
         .FirstOrDefault(); 

      //Calculate the total number of units for this item 
      var prodUnits = qty*prodIdAmount; 

      //Get the entire list of products with the specified catalog number excluding the product passed in 
      var uStoreProducts = 
       context.Products.Where(p => p.CatalogNo.Equals(currProdItem.CatalogNo) && !p.ProductID.Equals(prodId)) 
         .Select(p => p.ProductID); 


      //Loop through each product in the uStoreProductsList 
      foreach (var uStoreProduct in uStoreProducts) 
      { 
       var currentProduct = uStoreProduct; 

       //Get the current product's ProductUnitId to get the 'pieces' per "box" 
       var currentUnitId = 
        context.Products.Where(u => u.ProductID.Equals(currentProduct)) 
          .Select(u => u.ProductUnitID) 
          .FirstOrDefault(); 

       //Use the ProductUnitId to get the "Amount" from the ProductUnits table. 
       var inventoryFactor = 
        context.ProductUnits.Where(i => i.ProductUnitID.Equals(currentUnitId)) 
          .Select(i => i.Amount) 
          .FirstOrDefault(); 

       //Divide the quantity passed 
       var qtyInUnits = prodUnits/inventoryFactor; 

       var inventory = 
        context.ProductInventories.Where(pi => pi.ProductID.Equals(currentProduct)) 
          .Select(pi => pi.InventoryQuantity) 
          .FirstOrDefault(); 

       /*var inventory = (from i in context.ProductInventories 
           where i.ProductID == currentProduct 
           select i).FirstOrDefault(); 
       */ 


       if (inventory != null) 
       { 
        var newinv = inventory - qtyInUnits; 
        inventory = newinv; 
        //context.SaveChanges(); 
       } 
      } 
      context.SaveChanges(); 

     } 

    } 

The SaveChanges(), кажется, не обновлять ничего. Я отлаживал его, и значение инвентаря менялось на нужное значение, но по какой-то причине оно не обновляется. Я пробовал его внутри цикла и вне цикла, оба без изменений. Есть идеи? Что мне здесь не хватает?

+0

В своем коде, никаких записей не изменилось, что именно вы хотите обновить? –

+0

Что делать, если вы меняете строку 'var newinv = inventory - qtyUnits;' на 'inventory = inventory - qtyUnits;' –

+0

Я изначально пробовал это как инвентарь - = qtyUnits; –

ответ

2

Ваша проблема заключается в замене объекта, а не на повторном присвоении. Когда «newinv» создается, он отделен от вашего контекста, тогда как «инвентарь» - это прикрепленный объект. Когда «newinv» присваивается «инвентарь», тогда он теряет связь с контекстом.

Попробуйте это:

var prodInventory = 
        context.ProductInventories 
        .Where(pi => pi.ProductID.Equals(currentProduct)) 
        .FirstOrDefault(); 

       if (prodInventory != null) 
       { 
        var newinv = prodInventory.InventoryQuantity - qtyInUnits; 
        prodInventory.InventoryQuantity = newinv; // This updates the actual context object now. 
       } 
+0

Это работало как шарм. теперь мне нужно узнать, почему то, как я это делаю, не сработало ... Я, тем не менее, так как я делал выбор по этому свойству, а затем обновлял его, тогда это тоже сработало бы ... помните, что идея что я изначально ничего не сделал с новым, просто обновил инвентарь напрямую. –

+0

Причина, по которой он не обновлялся с вашим исходным кодом, - это Select, вы выбираете переменную, а не фактический объект базы данных. Вы должны явно изменить объект. –

2

Ваш code ничего не обновляет. Все, что вы делаете, это собирать объекты и присваивать вычисляемые значения локальным переменным. Но вы никогда не меняете property одного из ваших entities.

Обратите внимание, что выбор свойств ваших объектов, сохранение их в переменных и замена значения этой переменной не работает. Вам нужно выбрать объект, если вы хотите его изменить.

Смежные вопросы