您好我在数据库中有更新实体的下一个代码:
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;
}
答案 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
变量从不具有上下文,因此您不会收到此错误。