在BLL
public void Update(Product product)
{
if (repository.GetProductById(product.ID) != null )
{
repository.Update(product);
}
else
{
// Display errorrs
}
}
在存储库中
public void UpdateProduct(Product product)
{
_dbContext.Entry(product).State = EntityState.Modified;
_dbContext.SaveChanges();
}
public Product GetProductById(int id)
{
return _dbContext.Products.Find(id);
}
当我运行网站时,它会显示此错误
“ObjectStateManager中已存在具有相同键的对象.ObjectStateManager无法使用相同的键跟踪多个对象。”
我知道发生了什么。当我调用GetProductByID()附加到DbContext的产品实体时。因此,当我调用Update()时,它将复制Product实体。因为在Update()中我在DbContext中附加了现有的实体。
要解决它。我只调用Update()。但我想在更新/删除之前检查产品是否存在。
根据您的设计经验,如何以一种好的方式传递这个问题?
答案 0 :(得分:0)
您可以在数据库中查询断开连接的实体,如下所示:
public Product GetProductById(int id)
{
return _dbContext.Products.AsNoTracking().SingleOrDefault(o => o.Id == id);
}
或者你可以在你的代码中的其他地方做这样的检查:
public bool ProductExists(int id)
{
return _dbContext.Products.Any(o => o.Id == id);
}
答案 1 :(得分:0)
如果您将上下文设置为AsNoTracking(),则会停止aspmvc跟踪内存中实体的更改(这是您在Web上无论如何)。
_dbContext.Products.AsNoTracking().Find(id);
了解更多相关信息
佳日