SQLite作为SQL Server的内存数据库

时间:2016-06-29 23:56:54

标签: c# sql-server sqlite unit-testing dapper

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

我正在为我的DAL使用dapper和ad hoc SQL,并希望测试数据访问层而不依赖于SQL Server。我使用了SQLite内存数据库。问题是SQL语法和SQLite之间的SQL语法不同。

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

如果您有任何建议让我在内存单元测试中做什么怎么办?我没有使用模拟db上下文的EF路由,因为dapper性能更高,并且不想使用存储过程,因为我也想测试我的SQL。我不打算模拟我的数据库调用。

1 个答案:

答案 0 :(得分:0)

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

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

//InMemory Sqlite DB
var dbFactory = new OrmLiteConnectionFactory(":memory:", 
    SqliteDialect.Provider); 

然后你可以使用任何一个数据库来创建,保存和查询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();
}

但是如果使用Custom SQL API's to execute MSSQL-specific SQL,你将无法对SQLite执行该操作。您可以使用mockable support in OrmLite,但我个人建议坚持使用OrmLite的RDBMS不可知类型的API。