使用TRUNCATE和EF 4.1如何刷新对象管理器

时间:2014-01-08 11:09:46

标签: c# entity-framework

我正在使用使用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对象管理器我已截断表中的所有行?

1 个答案:

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