2 回答

TA貢獻1785條經驗 獲得超8個贊
每次同步數據庫時實例化一個新的數據上下文可以修復它,因為更改跟蹤器從“零”開始。在我看來這不是一個好的解決方案。
我寧愿說這是“正確”的解決方案。默認情況下,上下文元數據(又名Model
)按上下文類型緩存,數據庫連接由連接池維護,并且僅在需要時才打開/關閉。所以重用上下文實例的唯一好處是避免創建多個DbSet
實例。
同時,跟蹤器會保留大量“實體”實例,并防止它們在SaveChanges
調用后被垃圾回收,而無需任何需要。不算潛在的多線程訪問問題。
所以恕我直言,這就是要走的路——實例化新的上下文,用它做一些事情并處理它。
如果 EnsureDeleted 也“重置”更改跟蹤器或者您可以手動執行,那就太好了。
確實那會很棒。但目前EnsureDeleted
EF Core 和 EF Core 都沒有提供手動執行此操作的公共方式。
雖然有一種內部方法,但通常存在在未來某個 EF Core 版本中可能會更改的風險。添加
using Microsoft.EntityFrameworkCore.Infrastructure;
會允許你使用這樣的東西
_context.ChangeTracker.GetInfrastructure().ResetState();
大概之前_context.Database.EnsureDeleted();
。這基本上證明你真的應該使用第一個選項(新上下文)。
更新(EF Core 3.0): ChangeTracker
甚至在內部也不再公開StateManager
,所以我們需要
using Microsoft.EntityFrameworkCore.Internal;
分別
_context.GetDependencies().StateManager.ResetState();
更新(EF Core 5.0):感謝評論中的Vaclav Elias,現在 ChangeTracker 公開了一個 Clear() 方法來清除所有被跟蹤實體的 DbContext。
_context.ChangeTracker.Clear();

TA貢獻1829條經驗 獲得超4個贊
以下幾行對我有用。參考:https ://github.com/dotnet/efcore/issues/6282
context.ChangeTracker
.Entries()
.ToList()
.ForEach(e => e.State = EntityState.Detached);
context.Database.EnsureDeleted();
context.Database.EnsureCreated();
- 2 回答
- 0 關注
- 119 瀏覽
添加回答
舉報