我使用的是 EF5 Code First,需要一种快速清除表格的方法。因此,我制作了一个非常简单的方法来使用 ExecuteSqlCommand 来提供快速的表格清除。代码如下:
public void FastClearTable(Type tableType)
{
Context.Database.ExecuteSqlCommand(
string.Format("delete from {0}", PluraliseTableName(tableType.Name)));
}
我用它在重新计算之前清除表格。下面我列出了我的方法的简化版本。请注意,表的键是一个字符串(即不是标识键),因此我将使用与 ExecuteSqlCommand 删除的条目相同的键放入新条目。
public int ComputeNewTableContent( IRepository<MyClass> rep, IUnitOfWork uow)
{
if ( rep.GetUntracked().Count() > 0)
uow.FastClearTable( typeof(MyClass));
--- compute new entries and call rep.Insert( newEntry) for each one ---
uow.Commit(); //This calls DbContext.SaveChanges()
}
这第一次运行良好,但如果我再次运行它,我会在 SaveChanges() 命令上出现异常,该命令由 uow.Commit() 调用。例外是:
Message="调用的目标已抛出异常。"
InnerException Message="已成功提交对数据库的更改,但更新对象上下文时出错。ObjectContext 可能处于不一致状态。内部异常消息:AcceptChanges 无法继续,因为对象的键值与对象中的另一个对象冲突ObjectStateManager。在调用 AcceptChanges 之前确保键值是唯一的。”
如果找到这个存档的 MSDN帖子,并且在底部该人有同样的问题,但没有答案。我的观点是数据的内存版本仍然存在并且不知道ExecuteSqlCommand。但是,我对 EF 的了解还不够,还不知道如何解决它。
我当然可以通过使用“正常”删除来解决它,但我希望有人解释发生了什么以及我如何处理它。这将提高我对实体框架的了解。
提前致谢。