2013-04-05 80 views
0

我有以下代碼,我無法實現保存更改。 我的方法的參數是一個字符串,它包含我想在數據庫中修改的產品的RefCode,然後查詢將拉動應該修改的BaseProduct。 (我嘗試簡化代碼並將其設置爲英文,所以我可能會引入一些語法錯誤,但在調試模式下的代碼中,我從數據庫中獲取所有信息)。 Linq查詢中的「select new」有什麼問題嗎?實體框架簡單更新

public static void UpdateProduct(ViewProduct productToUpdate) 
    { 
     using (var context = new my_Entities()) 
     { 
      var BaseProduct = (from prod in context.Product 
           where prod.Ref == productToUpdate.BaseProduct.RefPrd 
             select new ViewBaseProduct 
             { 
              RefPrd = prod.Ref, 
              DescrPrd = prod.DescrPrd, 
              NormeCe = (bool)prod.NormeCE 
             }).FirstOrDefault(); 

      if (BaseProduct != null) 
      { 
       //BaseProduct.NormeCe = false; 
       BaseProduct = productToUpdate.BaseProduct; 
       context.SaveChanges(); 
      } 
     } 
    } 

回答

2

但BaseProduct是ViewBaseProduct對象,是一個ViewBaseProduct實體類?它似乎是一個ViewModel類。

您必須獲取產品實體,修改其字段並保存更改。看起來你只需要對ViewModel類進行更改。

試試這個:

public static void UpdateProduct(ViewProduct productToUpdate) 
{ 
    using (var context = new my_Entities()) 
    { 
     var BaseProduct = (from prod in context.Product 
          where prod.Ref == productToUpdate.BaseProduct.RefPrd) 
          .FirstOrDefault(); 

     if (BaseProduct != null) 
     { 
      //BaseProduct.NormeCe = false; 
      BaseProduct.field1 = productToUpdate.BaseProduct.field1; 
      BaseProduct.field2 = productToUpdate.BaseProduct.field2; 

      //update the necesary fields 
      //...... 
      context.SaveChanges(); 
     } 
    } 
} 
+0

你是對的,ViewBaseProduct是一個ViewModel類。 我會嘗試你的建議,現在看起來如此明顯...... – Bro 2013-04-05 07:53:23

+0

就是這樣:)感謝卡洛斯!當我在我的Linq查詢中「選擇新的ViewBaseProduct」時,我創建了一個與Enity沒有「鏈接」的對象,因此更新該對象不會影響數據庫中的數據。 – Bro 2013-04-05 09:41:02

0

這不會那樣工作。您應該使用CurrentValues.SetValues()方法:

contexte.Entry(BaseProduct).CurrentValues.SetValues(productToUpdate.BaseProduct); 
0

我認爲你必須嘗試這個

public static void UpdateProduct(ViewProduct productToUpdate) 
    { 
     using (var contexte = new my_Entities()) 
     { 
      var BaseProduct = (from prod in contexte.Product 
           where prod.Ref == productToUpdate.BaseProduct.RefPrd 
             select new ViewBaseProduct 
             { 
              RefPrd = prod.Ref, 
              DescrPrd = prod.DescrPrd, 
              NormeCe = (bool)prod.NormeCE 
             }).FirstOrDefault(); 

      if (BaseProduct != null) 
      { 
       BaseProduct.BaseProduct.RefPrd=productToUpdate.BaseProduct.RefPrd 
       BaseProduct.BaseProduct.DescrPrd=productToUpdate.BaseProduct.DescrPrd 
       BaseProduct.BaseProduct.NormeCE==(bool)productToUpdate.BaseProduct.NormeCE 
       contexte.SaveChanges(); 
      } 
     } 
}