gpt4 book ai didi

c# - ORMLite 下的 SQLite 不允许在事务完成后执行任何操作

转载 作者:IT王子 更新时间:2023-10-29 06:27:52 24 4
gpt4 key购买 nike

在我通过 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; }}

我得到的异常是:“事务与命令的连接无关”在 that line 附近失败OrmLite 的。但是,我根本不应该参与交易。

当我使用 SQL Server 作为提供程序时,代码如下

new OrmLiteConnectionFactory(
@"Data Source=.\SQLEXPRESS;Initial Catalog=TestEmpty;Persist Security Info=True;User ID=db;Password=db;",
false, SqlServerDialect.Provider, true);*/

这个测试工作正常。

我是否错误地结束了交易?它是 ServiceStack.OrmLite 中的错误吗?

最佳答案

原来类似的问题已经reportedfixed在我当前使用的版本中。将我的测试与 the passing one 进行比较后我发现我没有 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>());
}
}

关于c# - ORMLite 下的 SQLite 不允许在事务完成后执行任何操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15530631/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com