我正在使用使用EF 4.1的Windows服务。它从Web服务读取数据,并每4小时左右将其插入一个Cache表中。大约3k行av。
我有它使用EF 4.1删除所有行然后以std EF 4.1方式添加所有行。工作正常,即
....
foreach (var entityI in entityList)
{
_dbContext.GetDbSet<T>().Remove(entityI);
}
SaveChanges();
....
foreach (var entityI in entityList)
{
_dbContext.GetDbSet<T>().Add(entityI);
}
SaveChanges();
我要做的是使用TRUNCATE TABLE而不是删除但是当我这样做时,TRUNCATE TABLE工作正常,但添加行失败,说对象管理器不合时宜。
_dbContext.ExecuteSqlCommand("TRUNCATE TABLE " + entityName);
已成功提交对数据库的更改,但更新对象上下文时发生错误。 ObjectContext可能处于不一致状态。内部异常消息:AcceptChanges无法继续,因为对象的键值与ObjectStateManager中的另一个对象冲突。在调用AcceptChanges之前,请确保键值是唯一的。
如何告诉EF对象管理器我已截断表中的所有行?
答案 0 :(得分:0)
您可以尝试从ObjectStateManager中分离所有相应的实体。然后实体将被用于垃圾收集,最后被删除。
var adapter = (IObjectContextAdapter)_dbContext;
var objectContext = adapter.ObjectContext;
var entries = objectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified);
foreach(var entry in entries)
{
objectContext.Detach(entry);
}