【问题标题】:Loading and persisting an In-Memory SQLite database with EF Core使用 EF Core 加载和持久化 In-Memory SQLite 数据库
【发布时间】:2019-11-16 08:35:10
【问题描述】:

我正在为一个新项目做一些研究,我正在尝试确定是否可以(并且建议)将 SQLite 数据库加载到内存中,对其执行 CRUD 操作,并将其持久化。

我见过很多使用 SQLite 数据库(在内存中)进行单元测试的例子,在所有这些例子中,数据最终都被丢弃了——这不是我想要做的。

我可能会使用 Microsoft SQL Server 来管理整个站点数据并充当存储引擎(用户和凭据及其关联的 SQLite 数据库等)。

当用户在 UI 中选择 SQLite 数据库时,我想将其加载到服务器上的内存中,允许用户对其进行操作,然后将其持久化回存储引擎(SQL Server)而无需将 .db 文件保存到文件系统。

我对 EF Core + SQL Server 和 SQLite(针对文件系统)的各个方面感到满意。但对我而言,新的想法是针对内存中的 SQLite 数据库进行操作。

所以我的问题是:

  • EF Core 可以做到这一点吗?
  • 如果是这样,我将如何配置我的 SQLite DbContext 类来完成此操作?
  • 这有什么主要缺点吗?

谢谢

【问题讨论】:

  • 如果对内存中的数据库副本进行操作,如果其他用户正在修改现有的数据库(SQL Server)实例怎么办?用户可能会得到脏数据。
  • @RyanWilson 谢谢你,好点,我肯定会注意到像这样的设计的“主要缺点”。用户将拥有他们的数据库(因此多个用户编辑一个数据库不是问题) - 但是由单个用户打开多个 UI 仍然是一个问题。这个项目现在正在研究中,我正在尝试权衡这种方法的利弊。再次感谢!
  • 没问题。很高兴我能给你一些东西来看看。让我知道进展如何,我想听听项目的进展情况。

标签: c# entity-framework sqlite .net-core ef-core-3.0


【解决方案1】:

EF Core 可以做到这一点吗?

是的。为什么不? SQLite 本质上将内存数据库与其他任何数据库相同。有particular considerations,但本质上你插入和查询数据的方式是一样的。

如果是这样,我将如何配置我的 SQLite DbContext 类来完成此操作?

再次参考documentation。您需要提供一个特定的连接字符串。 (不要阻止 SO 问题,但如果你要研究和测试这个,你真的应该研究 sqlite.org 上提供的信息。它有很棒的、详尽的文档——至少与许多开源项目相比......有时有点分散,但仍然可以访问。)

也许比指定适当的连接字符串更复杂的是实际上将现有的数据库文件加载到内存中。默认的基本行为是只在内存中创建一个空数据库。加载数据有多种方式,this question 有一些有用的答案。

这有什么主要的缺点吗?

您显然已经发现了一些缺点,但可能只是需要合并/同步数据库的任何项目。这个问题没有简短的答案,而且对于 Stack Overflow 来说太宽泛了。

您特别提到了将数据同步到 SQL Server 而不将数据保存到磁盘文件。您当然必须从 sqlite 执行一系列查询,将数据按摩到 SQL Server 的相应更新语句中,然后在服务器上执行该语句。也许有第三方工具可以对基于文件的数据库执行相同的操作,但我怀疑您最终还是会对磁盘文件执行相同的操作。

【讨论】:

  • 请参阅this question 以使用与此问题相关的技术加载数据。 ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-15
  • 1970-01-01
  • 2020-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多