I am using npoco, trying to work with transactions, I can´t get the AbortTransaction
method to rollback anything in my db.
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();
}
}}
Call from test class:
_db = () => new Database(String.Format("DataSource={0};Persist Security Info=False;", DbPath),"System.Data.SqlServerCe.4.0");
_itemRepository = new ItemRepository(() => _db());
_itemRepository.Update();
------------- edit after suggested answer:
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();
}
Now I must use db.Transaction.Commit() to have something inserting in db. Then when trying to run db.AbortTransaction() I get error message:
"This SqlCeTransaction has completed; it is no longer usable."
Final solution update method:
var db = _dbFactory();
public void Update() {
try
{
db.BeginTransaction();
foreach(item in itemlist)
{
db.Insert(item);
}
db.CompleteTransaction();
}
catch(Exception)
{
db.Transaction.Rollback();
}
I am not sure if Rollback are needed in exception because when I testing with throwing exception the transaction dissapears.