SQLite 作为 SQL Server 的内存数据库

Jus*_*mes 5 c# sql-server sqlite unit-testing dapper

我的设置类似于使用内存中 SQLite ( http://mikhail.io/2016/02/unit-testing-dapper-repositories/ ) 使用以下库测试 SQL Server 的 dapper 调用:https://github。 com/ServiceStack/ServiceStack.OrmLite

我正在为我的 DAL 使用带有临时 SQL 的 dapper,并希望在不依赖 SQL Server 的情况下测试数据访问层。我使用了 SQLite 内存数据库。问题是 SQL Server 和 SQLite 之间的 SQL 语法不同。

例如,我有一个查询,它使用 offset 和 fetch next 返回分页结果,但 SQLite 仅支持 limit 和 offset。

如果您对我进行内存单元测试有什么建议怎么办?我没有使用模拟数据库上下文去 EF 路线,因为 dapper 的性能更高,并且不想使用存储过程,因为我也想测试我的 SQL。我不想模拟我的数据库调用。

myt*_*thz -1

Ormlite 的 Typed API 与 RDBMS 无关,因此只要您坚持使用 OrmLite 的 Typed API,您只需更改连接字符串和方言提供程序就可以轻松地在不同数据库之间切换,例如:

//SQL Server
var dbFactory = new OrmLiteConnectionFactory(connectionString,  
    SqlServerDialect.Provider);

//InMemory Sqlite DB
var dbFactory = new OrmLiteConnectionFactory(":memory:", 
    SqliteDialect.Provider); 
Run Code Online (Sandbox Code Playgroud)

然后您可以使用任一数据库来创建、保存和查询 POCO,例如:

using (var db = dbFactory.Open())
{
    db.DropAndCreateTable<Poco>();
    db.Insert(new Poco { Name = name });
    var results = db.Select<Poco>(x => x.Name == name);
    results.PrintDump();
}
Run Code Online (Sandbox Code Playgroud)

但是,如果使用自定义 SQL API 来执行 MSSQL 特定的 SQL,您将无法针对 SQLite 执行该 SQL。您可以利用OrmLite 中的可模拟支持,但我个人建议坚持使用 OrmLite 的 RDBMS 不可知类型 API。