koj*_*ojo 5 c# sqlite servicestack ormlite-servicestack
在我通过ServiceStack的OrmLite在SQLite中创建和提交事务后,我无法继续发出任何查询.
例如,以下测试失败:
[Test, Explicit]
public void Can_query_after_transaction_is_committed()
{
var connection = new OrmLiteConnectionFactory(":memory:", false, SqliteDialect.Provider, true);
using (var db = connection.OpenDbConnection())
{
db.DropAndCreateTable<SimpleObject>();
var trans = db.OpenTransaction();
db.Insert(new SimpleObject{test="test"});
trans.Commit();
Assert.DoesNotThrow(()=> db.Select<SimpleObject>()); //throws
}
}
class SimpleObject{public string test { get; set; }}
Run Code Online (Sandbox Code Playgroud)
我得到的例外是:"事务与命令的连接无关"在OrmLite的那一行周围失败.但是,我根本不应该参与交易.
当我使用SQL Server作为提供程序时,代码就像
new OrmLiteConnectionFactory(
@"Data Source=.\SQLEXPRESS;Initial Catalog=TestEmpty;Persist Security Info=True;User ID=db;Password=db;",
false, SqlServerDialect.Provider, true);*/
Run Code Online (Sandbox Code Playgroud)
这个测试工作正常.
我不正确地结束交易吗?它是ServiceStack.OrmLite中的错误吗?
事实证明,我目前正在使用的版本已经报告并修复了类似的问题.在将我的测试与传递的测试进行比较后,我发现我并没有Dispose()我的交易.
最后答案是:必须处理交易.如果不是,则在使用SQLite时代码将失败.
以下测试通过:
public void Can_query_after_transaction_is_committed()
{
var connection = new OrmLiteConnectionFactory(":memory:", true, SqliteDialect.Provider, true);
using (var db = connection.OpenDbConnection())
{
db.DropAndCreateTable<SimpleObject>();
using (var trans = db.OpenTransaction())
{
db.Insert(new SimpleObject {test = "test"});
trans.Commit();
}
Assert.DoesNotThrow(()=> db.Select<SimpleObject>());
}
}
Run Code Online (Sandbox Code Playgroud)