如何正确更新实体?

时间:2013-08-07 19:42:01

标签: c# entity-framework automapper

您好我在数据库中有更新实体的下一个代码:

 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的多个实例无法引用实体对象。 我应该怎样处理更新的对象?我是entityframework 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 个答案:

答案 0 :(得分:1)

您需要为GetProduct和UpdateProduct调用使用相同的上下文。当您调用GetProduct时,它所拥有的对象属于一个上下文,当您调用UpdateProduct时,您创建了一个不同的上下文,并尝试将其与仍分配给GetProduct的Product一起使用。

一种选择是传递上下文:

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

对于修改

您的g变量从不具有上下文,因此您不会收到此错误。