2

同様の質問がここで尋ねられましたが、回答がありませんでした。

EF CTP4 および SQL CE 4 で System.Transactions.CommittableTransaction を使用しようとしています。

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 を初期化する方法と関係がありますか?

4

1 に答える 1

2

この同じ問題に遭遇しました。CE コネクションではトランザクションを使用できません。最終的に、データコンテキストでce接続を管理し、アクションを保持する作業単位パターンを実装してから、SqlCeTransaction内でスケジュールされたすべてのアクションを実行し、自分でコミットまたはロールバックを呼び出しました。

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

于 2011-01-07T20:15:04.337 に答える