如何让实体框架核心/SQLite提交所有更改,以便存档底层文件?

holgip5t  于 2022-11-15  发布在  SQLite
关注(0)|答案(1)|浏览(126)

我有一组使用SQLite和实体框架核心的单元测试。这是第一个版本,为了发布这个问题,我已经将其简化为要点。代码位于两个using块中,原因应该很清楚。

/* Clear the files before starting. */
File.Delete("testdata.db");
File.Delete("copydata.db");

/* Create a fixed set of records suitable for unit testing. */
using (var db = new TestDataContext("testdata.db"))
{
  /* Create all the tables needed. */
  db.Database.EnsureCreated();

  /* Add several hundred fixed records that all unit tests use. */
  db.Add(new Person{Name="Bill", Vegetable="Rutabaga"});

  /* Save them all. */
  db.SaveChanges();
} /* Close connection. */

/* Open the file again. */
using (var db = new TestDataContext("testdata.db"))
{
  /* Read the first record of the many in the database. */
  Console.WriteLine(db.Persons.First().Name);
}

这是可行的,但有一个问题。有几(数百)个单元测试,每个单元测试都调用相同的代码来设置具有几(数百)个固定记录的数据库。这项工作需要花费大量的时间。相反,我想保存包含初始记录集的数据库文件,并为每个单元测试制作副本。
因此,让我们在两个块之间添加一行,并在第二个构造函数调用中更改文件名。

File.Copy("testdata.db", "copydata.db");
using (var db = new TestDataContext("copydata.db"))

似乎尽管调用了SaveChanges并关闭了using块,但磁盘上的文件没有更新。当代码尝试读取第一条记录并显示第一个Name值时,它抛出一个异常,报警表丢失。
如何提交通过实体框架核心所做的所有更改,以便可以复制包含所有更改的文件。
(注意:我没有包含TestDataContext的代码,因为它是一个完全普通的实体框架核心定制上下文,在OnConfiguring调用中调用UseSqlite,传入"Data Source=",后跟提供给构造函数调用的文件名。如果您真的需要它来回答问题,请留下评论。)

6rqinv9w

6rqinv9w1#

将pooling=False添加到您的连接字符串中,并使用文件的完整路径以避免混淆

相关问题