3

在 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()。但我想在更新/删除之前检查产品是否存在。

根据您的设计经验,如何以一种好的方式解决这个问题?

4

2 回答 2

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);
}
于 2014-04-23T17:47:42.237 回答
0

如果您将上下文设置为 AsNoTracking() 这将停止 aspmvc 跟踪内存中实体的更改(无论如何这都是您在网络上想要的)。

_dbContext.Products.AsNoTracking().Find(id);

我建议您在http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/advanced-entity-framework-scenarios-for-an-mvc-web上阅读更多相关信息-应用

亚什

于 2014-04-23T17:48:49.803 回答