C# 在EF 4.1中使用TRUNCATE如何刷新对象管理器

C# 在EF 4.1中使用TRUNCATE如何刷新对象管理器,c#,entity-framework,C#,Entity Framework,我正在开发一个使用EF4.1的windows服务。它从Web服务读取数据,并每隔4小时左右将其插入几个缓存表中。av约3k行 我让它使用EF4.1删除所有行,然后以std EF 4.1的方式添加所有行。工作很好 .... foreach (var entityI in entityList) { _dbContext.GetDbSet<T>().Remove(entityI); } SaveChanges(); .... foreach (var entityI in en

我正在开发一个使用EF4.1的windows服务。它从Web服务读取数据,并每隔4小时左右将其插入几个缓存表中。av约3k行

我让它使用EF4.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(); 
已成功提交对数据库的更改,但更新对象上下文时出错。ObjectContext可能处于不一致的状态。内部异常消息:AcceptChanges无法继续,因为对象的键值与ObjectStateManager中的另一个对象冲突。在调用AcceptChanges之前,请确保键值是唯一的


如何告诉EF对象管理器我已截断了表中的所有行?

您可以尝试从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);
}

他也有类似的想法。没有从GetObjectStateEntries返回的条目,尽管我可以使用GetObjectByKey找到它们。但随后无法分离。最后返回行,但现在表示该对象无法分离,因为它未连接。若要附加,我需要一个IEntityWithKey。在执行truncate命令后,是否可以尝试执行objectContext.Refresh(RefreshMode.StoreWins,objectContext.)?应重新加载数据存储中的实体,该实体应为空。尝试了以下操作:System.InvalidOperationException:要刷新的对象集合中索引0处的元素具有null EntityKey属性值或未附加到此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);
}