2013-08-07 4 views
0

Привет У меня есть следующий код для обновления объекта в базе данных:Как правильно обновить объект?

public async void UpdateProductFromModel(ProductEditModel model) 
     { 
      var res = await GetProduct(model.GoodId);   
      Mapper.Map<ProductEditModel, Goods>(model, res); 
      UpdateProduct(res); 
     } 

     public void UpdateProduct(Goods product) 
     { 
      try 
      { 
       using (var dbCtx = new smartbags_storeEntities()) 
       { 
        dbCtx.Entry(product).State = EntityState.Modified; 
        dbCtx.SaveChanges(); 
       } 
      } 
      catch (Exception ex) 
      { 

       throw ex; 
      } 

     } 

public async Task<Goods> GetProduct(int id) 
     { 
      try 
      { 
       var dbCtx = new smartbags_storeEntities(); 

       return await dbCtx.Goods.FirstOrDefaultAsync(d => d.GoodID == id); 

      } 
      catch (Exception ex) 
      { 

       throw ex; 
      } 
     } 

, но я получаю сообщение об ошибке Объект объект не может ссылаться несколько экземпляров IEntityChangeTracker. Что делать с обновленным объектом? Я новый коммерсант в сущностной работе 6 спасибо.

ОБНОВЛЕНИЕ @ O.O Создание и обновление объекта. Этот код работает. как вы можете видеть, создание и обновление - это другой контекст.

public bool SaveNewProduct(ProductEditModel model) 
     { 
      var prices = model.Prices; 
      var g = new Goods 
         { 
          Article = model.Article, 
          CategoryID = model.CategoryId, 
          Code = model.Code, 
          Description = model.Description, 
          Name = model.Name, 
          IsExclusive = model.IsExclusive, 
          IsNew = model.IsNew, 
          IsVisible = model.IsVisible, 

         }; 


      AddNewProductToDb(g); 

      //update prices 
      if (prices.Any(d => d.IsActive) && g.Prices1.Any() && prices.Count() > 1) 
      { 
       var pr = prices.FirstOrDefault(d => d.IsActive); 
       g.PriceID = g.Prices1.First().PriceID; 
      } 

      UpdateProduct(g); 
      return true; 
     } 
public int? AddNewProductToDb(Goods product) 
     { 
      try 
      { 
       using (var dbCtx = new smartbags_storeEntities()) 
       { 
        //add standard entity into standards entitySet 
        dbCtx.Goods.Add(product); 
        //Save whole entity graph to the database 
        dbCtx.SaveChanges(); 
        return product.GoodID; 
       } 
      } 
      catch (Exception ex) 
      { 

       throw; 
      } 
      return null; 
     } 

ответ

1

Необходимо использовать тот же контекст для вызовов GetProduct и UpdateProduct. Когда вы вызывали GetProduct, объект, который он получил, принадлежал одному контексту, а когда вы вызвали UpdateProduct, вы создали другой контекст и попытались использовать его с Продуктом, который все еще был назначен GetProduct.

Одним из вариантов является передача в контексте:

var dbCtx = new smartbags_storeEntities() 
var res = await GetProduct(model.GoodId, dbCtx);   
Mapper.Map<ProductEditModel, Goods>(model, res); 
UpdateProduct(res, dbCtx); 

Для вашего Edit:

Ваш g переменная не имеет контекст, так что, почему вы не получите эту ошибку.

+0

Да, возможно. Но у меня есть другой случай в моем коде, я создал новый объект и могу обновить этот объект в разных контекстах. Я обновлю свой вопрос, чтобы показать вам. Почему это возможно? –

+0

@ a3code - показать код. Если вы не получите ошибку в другом месте, это должно сказать вам, что вы делаете правильно/неправильно. –

+0

Я добавил код с созданием и обновлением объекта в разном контексте. –