【问题标题】:EF, Update doesnt work, it says Entities may have been modified or deleted since entities were loaded.EF,更新不起作用,它说自加载实体以来实体可能已被修改或删除。
【发布时间】:2017-04-19 16:38:38
【问题描述】:

我正在尝试创建一个分层的 MVC 项目,但我在 EF 中遇到了 UPDATE 问题。我收到以下错误。

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);
}

为什么会出现上述错误,我该如何解决?

【问题讨论】:

  • 你可以下一个断点并检查实体有id吗?

标签: c# entity-framework


【解决方案1】:

一个常见的原因是 context.Entry(entity) 无法获取您要更新的实体。

调试的时候看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)

【讨论】:

  • 感谢您的帮助。我按照您所说的进行了尝试,并且 context.Entry(entity) 按预期返回了对象。我还应该检查什么?
  • 所以“这通常是因为身份/主键列未设置在‘实体’上。”解决了我的问题。使用 'Add-Migration name' public override void Up() { AlterColumn("dbo.TableName", "Id", c => c.Int(nullable: false, identity: true)); AddPrimaryKey("dbo.Name", "Id"); } 公共覆盖无效 Down() { DropPrimaryKey("dbo.TableName"); }
【解决方案2】:

必须先为您正在更新的实体调用 DbSet 上的 Attach 方法,然后才能更改其状态。本地 DbContext 需要包含实体,否则它将不知道要跟踪哪些更改。

https://msdn.microsoft.com/en-us/library/gg696261(v=vs.103).aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    相关资源
    最近更新 更多