在SQLite单元测试中处理”模式”

Handling “schema” in SQLite Unit Tests

我有一个项目,正在使用Fluent NHibernate映射SQL Server数据库,并从另一个Fluent NHibernate映射的SQL Server数据库生成数据,这是我们的来源。

我目前正在编写一些单元测试,以检查从一个数据库读取的功能并在另一个数据库中创建记录。
我已经为数据库创建了一个内存中的SQLite数据库以创建记录,并且工作正常。但是,当我尝试为我的"源"数据库创建一个类似的SQLite数据库时,会出现失败,并声称"没有这样的表"。

这似乎是因为在源数据库的Fluent NHibernate dll中,它们使用了类似" dbo.table"的名称,并且由于我的SQLite测试数据库中没有架构,因此无法创建测试表。

有没有办法处理此" dbo"。创建测试数据库时在SQLite中的名称?


1
SELECT * from dbo.mytable

与:

相同

1
SELECT * from"dbo"."mytable"

要使其正常工作,您需要附加另一个名为dbo的数据库,如下所示:

1
ATTACH DATABASE ':memory:' AS dbo

或者,将表名用引号引起来(如果使用NHibernate可能的话),以便该点成为表名的一部分:

1
SELECT * FROM"dbo.mytable"

您可以将委托传递给SchemaExport.Execute来修改脚本调用。将execute参数设置为false,您可以修改脚本的行并自己调用:

1
2
3
4
5
6
7
8
schemaExport.Execute(script =>
{
    using (var cmd = session.Connection.CreateCommand())
    {
        cmd.CommandText = script.Replace("dbo.","dbo_");
        cmd.ExecuteNonQuery();
    }
}, false, false, exportSchemaOutput);

(假设您已经调用了ISession对象)。