SQL CE 4 System.Transaction поддержки - PullRequest
2 голосов
/ 17 ноября 2010

Подобный вопрос был задан здесь , но ответа не было.

Я пытаюсь использовать транзакцию 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 Ответ

2 голосов
/ 07 января 2011

Я столкнулся с этой же проблемой.Вы не можете использовать транзакции с CE Connection.Я закончил тем, что мой datacontext управлял моим соединением ce и реализовал шаблон единицы работы для хранения моих действий, затем выполнил все запланированные действия внутри SqlCeTransaction, затем сам вызвал commit или rollback.

http://msdn.microsoft.com/en-us/library/csz1c3h7.aspx

...