2013-04-05 5 views
0

У меня есть следующий код, и я не могу добиться сохранения изменений. Параметр моего метода - это строка, содержащая RefCode продукта, который я хочу изменить в базе данных, затем запрос вытаскивает BaseProduct, который должен быть изменен. (Я попытался упростить код и установить его на английском языке, поэтому я, вероятно, ввел некоторые синтаксические ошибки, но в моем коде в режиме отладки я получаю всю информацию ОТ БД). Что-то не так с «select new» в запросе Linq?Простое обновление с Entity Framework

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

+0

вот оно :) Спасибо Carlos! Когда я делал «select new ViewBaseProduct» в моем запросе Linq, я создавал объект, который не был «связан» с Enity, поэтому обновление этого объекта не могло повлиять на данные в базе данных. – Bro

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(); 
      } 
     } 
} 
Смежные вопросы