【发布时间】:2014-12-25 04:43:15
【问题描述】:
我正在使用 npoco,尝试处理事务,我无法使用 AbortTransaction 方法回滚数据库中的任何内容。
public class ItemRepository
{
private Func<Database> _db;
public ItemRepository(Func<Database> db)
{
_db = db;
}
Public void Update(){
using (_db().Transaction)
{
_db().BeginTransaction();
foreach (var item in itemToUpdate.Items)
{
_db().Insert(item);
if (SomethingIsNotCorrect())
{
_db().AbortTransaction();
}
}
_db().CompleteTransaction();
}
}}
从测试类调用:
_db = () => new Database(String.Format("DataSource={0};Persist Security Info=False;", DbPath),"System.Data.SqlServerCe.4.0");
_itemRepository = new ItemRepository(() => _db());
_itemRepository.Update();
-------------建议答案后编辑:
var db = _db();
using (db.Transaction)
{
db.BeginTransaction();
foreach (var item in itemToUpdate.Items)
{
db.Insert(item);
db.Transaction.Commit();
if (GetNutrientConns(itemToUpdate).Count > 2)
{
db.AbortTransaction();
}
}
db.CompleteTransaction();
}
现在我必须使用 db.Transaction.Commit() 在 db 中插入一些东西。然后,当尝试运行 db.AbortTransaction() 时,我收到错误消息:
“此 SqlCeTransaction 已完成;它不再可用。”
【问题讨论】:
-
什么是_db()?不要说它是返回新数据库连接的方法
-
@Reniuz, private Func
_db;在构造函数中设置一次,所以应该是一样的.. -
@daniel_aren 我以前从未使用过这个库,但我强烈怀疑你应该调用一次,将结果存储在字段或变量中,然后反复引用它。
-
实际上,您能否在此处向我们展示您作为调用图一部分的所有代码,所以我们不会在猜测?请在此处包含构造函数和您所指的任何字段。
-
这不是您在构造函数中接受的
Database实例。这是一个返回数据库实例的函数。无论是产生一个新的还是一遍又一遍地返回同一个对我们来说都是不透明的(显然对你来说也是如此,因为你在你的构造函数中接受它)。创建IDatabase或Database或其他类型的字段,并将_db = db()存储在您的构造函数中。另外,请将您接受的Func<Database> db参数重命名为dbFactory或其他名称,因为就是这样。
标签: c# .net compact-database npoco