2 回答

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

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超4個(gè)贊
以下幾行對我有用。參考: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 關(guān)注
- 118 瀏覽
添加回答
舉報(bào)