小编psc*_*hlz的帖子

如何使用 SQLite 删除整个数据库并使用 EF Core 重置更改跟踪器

我有一个服务器客户端架构,其中服务器为客户端提供了一个 Rest API 来同步整个数据库数据。他们将其保存到本地 SQLite 数据库中。该模型位于共享项目中,有时可能会发生变化。因此,客户端需要更新其本地 SQLite 数据库架构。这当然只有在更新客户端软件后才会发生(数据库文件保持不变)。

它只是通过通常删除数据库文件然后重新创建它来实现。

_context.Database.EnsureDeleted();
_context.Database.EnsureCreated();

AttachNewDataFromServerToDatabaseContext(_context);

_context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

Rest API 服务被实例化为单例并始终使用相同的数据库上下文对象。第一次同步工作正常。但接下来的失败:

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.
Run Code Online (Sandbox Code Playgroud)

因此,尽管整个数据库已被删除,但更改跟踪器仍然知道“旧”实体。

我对此的看法:

  • 每次同步数据库时实例化一个新的数据上下文可以修复它,因为更改跟踪器从“零”开始。在我看来不是一个好的解决方案。
  • 如果EnsureDeleted 还“重置”更改跟踪器,或者您可以手动进行,那就太好了。

你怎么看待这件事?谢谢你的帮助!

c# sqlite entity-framework-core

6
推荐指数
2
解决办法
2200
查看次数

标签 统计

c# ×1

entity-framework-core ×1

sqlite ×1