我正在尝试创建一个分层的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);
}
为什么我收到上述错误,我该怎么做才能修复它?
答案 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