EF,更新不起作用,它表示实体可能已被修改或删除,因为实体已加载。

时间:2017-04-19 16:38:38

标签: c# entity-framework

我正在尝试创建一个分层的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中,我有以下UPDATE代码

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

为什么我收到上述错误,我该怎么做才能修复它?

2 个答案:

答案 0 :(得分:3)

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

当你进行调试时,看看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();
    }
}

如果不是,那么您需要回过头来查看代码并弄清楚为什么它无法提取代码。通常这是因为身份/主键列未设置在'实体'。

E.g。在MVC应用程序中,如果您有编辑/更新表单,请记得有一个

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

答案 1 :(得分:0)

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

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