2014-01-08 36 views
0

我正在使用使用EF 4.1的Windows服務。它從Web服務中讀取數據,並每隔4個小時左右將其插入一個Cache表中。大約3k行av。在EF 4.1中使用TRUNCATE如何刷新對象管理器

我擁有它使用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可能處於不一致的狀態。內部異常消息:由於對象的鍵值與ObjectStateManager中的另一個對象衝突,因此AcceptChanges無法繼續。在調用AcceptChanges之前確保鍵值是唯一的。

如何告訴EF對象管理器我截斷了表中的所有行?

回答

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); 
} 
+0

有過類似的想法。儘管我可以使用GetObjectByKey找到它們,但沒有條目從GetObjectStateEntries返回。但後來無法分離。 –

+0

最後得到的行返回,但現在說該對象不能被分離,因爲它沒有連接。附加我需要一個IEntityWithKey。 –

+0

你可以在做截斷命令後嘗試做一個objectContext.Refresh(RefreshMode.StoreWins,objectContext。)嗎?這應該重新加載數據存儲中的實體,該實體應該是空的。 – scheien

相關問題