第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

如何使用 SQLite 刪除整個(gè)數(shù)據(jù)庫并使用 EF Core 重置更改跟蹤器

如何使用 SQLite 刪除整個(gè)數(shù)據(jù)庫并使用 EF Core 重置更改跟蹤器

Go
收到一只叮咚 2022-11-21 20:15:50
我有一個(gè)服務(wù)器客戶端架構(gòu),其中服務(wù)器為客戶端提供 Rest API 以同步整個(gè)數(shù)據(jù)庫數(shù)據(jù)。他們將其保存到本地 SQLite 數(shù)據(jù)庫中。該模型位于共享項(xiàng)目中,有時(shí)會發(fā)生變化。因此,客戶端需要更新他們本地的 SQLite 數(shù)據(jù)庫模式。這當(dāng)然只發(fā)生在更新客戶端軟件之后(數(shù)據(jù)庫文件保持不變)。它通常通過刪除數(shù)據(jù)庫文件并在之后重新創(chuàng)建來簡單地實(shí)現(xiàn)。_context.Database.EnsureDeleted();_context.Database.EnsureCreated();AttachNewDataFromServerToDatabaseContext(_context);_context.SaveChanges();Rest API 服務(wù)被實(shí)例化為 singelton,并始終使用相同的數(shù)據(jù)庫上下文對象。第一次同步工作正常。但是接下來的失敗了:System.InvalidOperationException: The instance of entity type '***' cannot be tracked because another instance with the key value '{id:  ***}' is already being tracked. When attaching existing entities, ensure that only one entity instance with a given key value is attached.因此,盡管整個(gè)數(shù)據(jù)庫已被刪除,但更改跟蹤器仍然知道“舊”實(shí)體。我對此的看法:每次同步數(shù)據(jù)庫時(shí)實(shí)例化一個(gè)新的數(shù)據(jù)上下文可以修復(fù)它,因?yàn)楦母櫰鲝摹傲恪遍_始。在我看來這不是一個(gè)好的解決方案。如果 EnsureDeleted 也“重置”更改跟蹤器或者您可以手動執(zhí)行,那就太好了。你怎么看待這件事?謝謝你的幫助!
查看完整描述

2 回答

?
慕的地10843

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í)那會很棒。但目前EnsureDeletedEF 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();


查看完整回答
反對 回復(fù) 2022-11-21
?
浮云間

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();


查看完整回答
反對 回復(fù) 2022-11-21
  • 2 回答
  • 0 關(guān)注
  • 118 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號