Добрый день.
У меня следующая проблема.
Есть DAL класс, наследуемый от DataAccessor, в нем объявлен абстрактный метод:
[SprocName("Projects_Insert")]
public abstract override int Insert(Project project);
Из класса бизнес логики вызываю этот метод, все работает нормально. Но как только пытаюсь поместить его в пределы транзакции он перестает работать.
Делаю следующее — в DAL классе переопределяю метод GetDbManager():
private static DbManager db = new DbManager();
public override DbManager GetDbManager()
{
return db;
}
т.е. теперь он гарантированно возвращает один и тот же экземпляр DbManager.
В классе бизнес логики получаю ссылку на db и заворачиваю все в транзакцию:
DbManager db = DAL.GetDbManager();
db.BeginTransaction();
projectId = DAL.Insert(project);
db.CommitTransaction();
Так вот почему то этот код не работает, т.е. данные не вставляются. При этом в методе Insert используется тот же DbManager что и при открытии и коммите транзакции, т.к. если смотреть выполнение под дебагером, то перед вызовом Insert вызывается переопределенный GetDbManager(). Кроме того если б для Insert использовался другой DbManager, запись вставлялась бы по любому, т.к. вставка была бы не внутри транзакции. Такое чувство возникает, будто абстрактная реализация метода что-то делает с объектом DbManager и транзакция открывается нормально но вот не коммитится.
Если же метод в DAL классе сделать не абстрактным и то все работает.
В чем может быть проблема?
Спасибо.
P.S. Транзакция мне нужна для того чтобы потом добавить еще несколько обращений к БД, т.е. один метод внутри транзакции — это пока для теста.