【发布时间】:2014-11-11 17:26:42
【问题描述】:
我正在尝试使用 EF6 更新记录。首先找到记录,如果存在,更新。 这是我的代码:
var book = new Model.Book
{
BookNumber = _book.BookNumber,
BookName = _book.BookName,
BookTitle = _book.BookTitle,
};
using (var db = new MyContextDB())
{
var result = db.Books.SingleOrDefault(b => b.BookNumber == bookNumber);
if (result != null)
{
try
{
db.Books.Attach(book);
db.Entry(book).State = EntityState.Modified;
db.SaveChanges();
}
catch (Exception ex)
{
throw;
}
}
}
每次我尝试使用上述代码更新记录时,都会收到此错误:
{System.Data.Entity.Infrastructure.DbUpdateConcurrencyException:存储 更新、插入或删除语句影响了意外数量的 行 (0)。实体可能已被修改或删除,因为实体 被加载。刷新 ObjectStateManager 条目
【问题讨论】:
-
旁注:
catch (Exception ex){throw;}是多余的,您可以完全删除它。 -
try catch 块只是为了找出失败的原因。但是仍然不明白为什么这段代码会失败?
-
我不是这个主题的专家,我无法回答这个问题。但是如果没有 try catch 也可以在出现异常时使用break when exception is thrown feature 来中断调试器。
-
你没有改变任何东西。使用实体状态不会改变对象实际上没有被修改的事实。
-
好吧,我做了和你一样的事情,没有得到错误。异常说 DbUpdateConcurrencyException。你是如何处理并发的?您是否使用了时间戳,您是否克隆然后再次合并对象,或者您是否使用了自我跟踪实体? (3 种最常用的方法)。如果你没有处理并发,我想这就是问题所在。
标签: c# entity-framework entity-framework-6 ef-database-first