Search code examples
c#.netcompact-databasenpoco

Why doesn't AbortTransaction work?


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."


Solution

  • 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.