Старанности транзакций
От: A1eksL  
Дата: 21.02.11 14:45
Оценка:
Здравствуйте.
Есть BaseAccessor, в нём:
public override DbManager GetDbManager()
{
var db = new DbManager("TestDb");// DbManagerSingleton;
db.InitCommand += DbInitCommand;
return db;
}
От него наследуются другие аксесоры.

Пробую что-нибудь сделать в транзакции:

static class TestModel
{
public static void AddEntities(List<Entity> entities)
{
var accessor = DataAccessor.CreateInstance<TestAccessor>();
accessor.BeginTransaction();
foreach (Entity ent in entities)
if (accessor.AddEntity(ent.Id, ent.AnyField) == 1)
{
accessor.RollbackTransaction();
return;
}
accessor.CommitTransaction();
}
}

На строке accessor.BeginTransaction();
получаю InvalidOperationException. "DbManager object is not provided."

StackTrace:
at BLToolkit.DataAccess.DataAccessorBase.BeginTransaction()
at BLToolkitTransactions.ModelLayer.TestModel.AddEntities(List`1 entities) in C:\Команда — Развитие\BLToolkitTransactions\BLToolkitTransactions\ModelLayer\TestModel.cs:line 18
at BLToolkitTransactions.Program.Main(String[] args) in C:\Команда — Развитие\BLToolkitTransactions\BLToolkitTransactions\Program.cs:line 24
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()

Почему не работает и говорит, что нет DbManager'а, хотя я заоверайдил GetDbManager?

Хорошо, делаю, как в примере в доках показано:
using (var db = new DbManager("TestDb"))
{
var accessor = DataAccessor.CreateInstance<TestAccessor>(db);
accessor.BeginTransaction();
//...

Эксепшн теперь не получаю, но транзакции не работают. Откат не происходит, когда нужно — все изменения, которые были внесены до места, где должен быть откат — так и остаются.

Работать начинает, только если убрать оверайд GetDbManager() из BaseAccessor'а.

А как мне заставить работать транзакции, если я хочу, чтобы там всё равно был этот оверайд?
Чтобы было единственное место, в котором создаётся DbManager("TestDb") и фигурирует строка "TestDb"?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.