C# EF,更新不起作用,它说自从实体加载后,实体可能已经被修改或删除。

C# EF,更新不起作用,它说自从实体加载后,实体可能已经被修改或删除。,c#,entity-framework,C#,Entity Framework,我试图创建一个分层的MVC项目,但我在EF中遇到了更新问题。我得到以下错误 Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. 我有DAL和BusinessLayer。在DAL中,我有以下更新代码 public void Update(

我试图创建一个分层的MVC项目,但我在EF中遇到了更新问题。我得到以下错误

Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. 
我有DAL和BusinessLayer。在DAL中,我有以下更新代码

public void Update(params T[] entities)
{
    using (var context = new BorselDBEntities())
    {
        foreach (T entity in entities)
        {
            context.Entry(entity).State = EntityState.Modified;
        }   
        context.SaveChanges();
    }
}
这就是我如何称呼BusinessLayer的DAL

public void UpdateProduct(params Product[] products)
{
   _productRepository.Update(products);
}

为什么会出现上述错误?我可以做些什么来修复它?

一个常见的原因是上下文。条目(实体)无法获取要更新的实体

调试时,查看context.Entry(entity)是否返回实体;通过将其放在单独的行上并在后面设置断点,可以轻松完成:

public void Update(params T[] entities)
{
    using (var context = new BorselDBEntities())
    {
        foreach (T entity in entities)
        {
            var myEntity = context.Entry(entity);
            myEntity.State = EntityState.Modified;
        }   
        context.SaveChanges();
    }
}
如果不是这样,您需要重新检查代码,并找出它无法接收的原因。这通常是因为未在“实体”上设置标识/主键列

例如,在MVC应用程序中,如果您有一个编辑/更新表单,请记住使用

@Html.HiddenFor(model => model.Id)

在更改实体的状态之前,有必要为要更新的实体调用DbSet上的Attach方法。本地DbContext需要包含实体,否则它将不知道要跟踪哪些更改


谢谢你的帮助。我试着按照你说的和上下文。Entry(entity)按预期返回对象。我还应该检查什么?所以“这通常是因为没有在“实体”上设置标识/主键列。”修复了我的问题。使用“添加迁移名称”公共覆盖void Up(){AlterColumn(“dbo.TableName”,“Id”,c=>c.Int(nullable:false,identity:true));AddPrimaryKey(“dbo.name”,“Id”);}公共覆盖void Down(){DropPrimaryKey(“dbo.TableName”);}能否放置断点并检查实体是否具有id?