c# - 应用程序内的 SQLite 文件版本兼容性

标签 c# json entity-framework sqlite serialization

我有一个 C# .NET 应用程序(一种复杂计算应用程序),其中用户输入数据,并使用 JSON 序列化和 EF 将处理后的信息保存到 SQLite 文件中。需要时可以将其加载到我们的应用程序中。

应用程序在开发过程中经历了很多变化,类也被修改。因此,之前在 SQLite 文件中保存的序列化对象与新的不同。

我想为旧文件提供兼容性,以便可以在新应用程序中打开它。

简单来说,使用 JSON 序列化以 bool 作为成员的 .NET 类“class XYZ”,并将其保存为 SQLite 文件中的 BLOB。后来在新版本的app中,“class XYZ”的bool成员被修改为int。如何将之前保存的 bool 类型文件反序列化到新应用程序中?

整个版本中 SQLite 表结构也发生了变化。如何在.NET 中实现这一点?

最佳答案

这是一个非常常见的问题,我认为与 C# 语言无关。它有两种实现此类版本控制的方法:

  1. 创建一张只有一个INTEGER列的表,该表仅包含一行(从而模拟数据库变量),其中包含数据库和结构模式的版本。每次架构更改时,您都会增加与其关联的版本。对于每个新版本,您编写升级语句和函数来获取原始 JSON 对象(不会转换为类实例,因为它们不兼容)、更新、删除和创建更改的结构字段。然后将转换后的结构写入升级后的架构。我已经做过很多次了,当然,这非常乏味,而且你必须小心谨慎,但这几乎是唯一可靠的方法(据我所知)。
  2. 使用诸如 Protocol Buffer 之类的库它支持结构更改(当然是有限的)。这样的库可以帮助您进行结构更改,但不能帮助您更改数据库架构 - 无论哪种方式,您可能都必须使用架构版本维护提到的单单元格表,并在看到较低数字时升级它。

关于c# - 应用程序内的 SQLite 文件版本兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13720206/

相关文章:

c# - 创建新记录时,如何使用过滤器中的值填充某些字段?

entity-framework - 如何使用 Entity Framework 和 EntityState.Modified 更新对象的并非每个字段

JSON 包含负 ("-") char : is this valid/standard?

c# - 如何将 "Assert.That()"列表中的项目与 NUnit 匹配某些条件?

c# - WPF XAML 解析错误。 "Data at the root level is invalid."

c# - 如何围绕其中心旋转 3D 模型?

javascript - 传输 backbone.js 模型?

java - JsonDeserializer不适用于该类,而仅适用于该类的单个元素

c# - 如何使用 EF6 获取大量记录

c# - OpenIdConnectEvents OnAuthorizationCodeReceived 未触发