我有一组使用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="
,后跟提供给构造函数调用的文件名。如果您真的需要它来回答问题,请留下评论。)
1条答案
按热度按时间6rqinv9w1#
将pooling=False添加到您的连接字符串中,并使用文件的完整路径以避免混淆