SQL CE 4 System. Поддержка транзакций
Подобный вопрос был задан здесь, но не получил ответа.
Я пытаюсь использовать System.Transactions.CommittableTransaction с EF CTP4 и SQL CE 4.
Я создал следующий атрибут транзакции для моих действий контроллера ASP.NET MVC:
public class TransactionAttribute : ActionFilterAttribute
{
CommittableTransaction transaction;
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
transaction = new CommittableTransaction();
Transaction.Current = transaction;
base.OnActionExecuting(filterContext);
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
base.OnResultExecuted(filterContext);
try
{
var isValid = filterContext.Exception == null || filterContext.ExceptionHandled;
if (filterContext.Controller.ViewData.ModelState.IsValid && isValid) {
transaction.Commit();
} else {
transaction.Rollback();
Transaction.Current = null;
}
}
finally
{
transaction.Dispose();
}
}
}
Когда я использую этот фильтр, я получаю ошибку:
System.InvalidOperationException: объект соединения не может быть зачислен в область транзакции.
Тем не менее, следующий тест проходит:
[Test]
public void Transaction_rolls_back_if_exception()
{
var transaction = new CommittableTransaction();
Transaction.Current = transaction;
try
{
var project = new Project { Title = "Test" };
projectRepo.SaveOrUpdate(project);
context.SaveChanges();
var post = new Post { Title = "Some post" };
blogRepo.SaveOrUpdate(post);
throw new Exception();
context.SaveChanges();
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
Transaction.Current = null;
}
projectRepo.GetAll().Count().ShouldEqual(0);
blogRepo.GetAll().Count().ShouldEqual(0);
}
Это как-то связано с тем, как я инициализирую DbContext?
1 ответ
Я столкнулся с этой же проблемой. Вы не можете использовать Транзакции с CE Connection. Я закончил тем, что мой datacontext управлял моим соединением ce и реализовал шаблон единицы работы для хранения моих действий, затем выполнил все запланированные действия внутри SqlCeTransaction, а затем сам вызвал commit или rollback.