两种连接方法的交易范围

时间:2011-11-19 05:46:58

标签: asp.net sql-server entity-framework transactions entity-framework-4.1

我的ASP.NET MVC应用程序正在使用Application Services for Membership。出于多种原因,我没有使用应用程序服务配置文件。我在一系列连接到Membership表的定制表中管理配置文件。 我的域模型包含使用实体框架(DbContext)映射到我的表(包括配置文件表但不包括应用程序服务表)的类。

当成员资格提供者创建新用户时,如果我的任何配置文件准备步骤失败,我想在我的配置文件表中执行大量操作并回滚成员身份。

因此,我更改了注册方法,以包含对执行我想要的工作的方法的调用,并将其全部放在TransactionScope中。当没有Transaction时,代码工作正常,但是使用TransactionScope,只要从Repository类(在一个单独的程序集中)中调用context.SaveChanges()方法,我就会收到错误:“提供程序确实不返回ProviderManifestToken字符串。“

using (TransactionScope scope = new TransactionScope())
{
System.Web.Security.MembershipUser newUser = Membership.CreateUser
    (model.UserName, model.Password, model.Email, null, null, true, null, out createStatus);

if (createStatus == MembershipCreateStatus.Success)
{
    FormsAuthentication.SetAuthCookie(model.UserName, false /* createPersistentCookie */);

    // Create the profile and permissions
    bool profileCreation = repository.NewUser(newUser.UserName, newUser.ProviderUserKey);

    if (profileCreation)
    {
        scope.Complete();
        return RedirectToAction("List", "Project");
    }
    else scope.Dispose();
}
else
{
    scope.Dispose();
    ModelState.AddModelError("", ErrorCodeToString(createStatus));
}                    
}

事务是否可以处理来自Entity Framework和Application Services代码的数据库连接(我不知道它使用什么连接方法)?如果是这样,我该如何做到这一点?

我会非常感谢任何帮助, 戴夫

2 个答案:

答案 0 :(得分:2)

听起来好像EF或您的会员提供者未参与交易(EnlistTransaction)。每个参与者的SQL连接是否属于同一服务器(显然是不同的数据存储)?您可以尝试仅使用成员资格提供程序或仅使用实体框架来执行事务范围,以查看哪一个导致了悲痛。

请参阅此帖子关于transaction scope usage

由于您处于scope.Dispose()声明,因此您也无需致电using。这隐含地为你完成了。

答案 1 :(得分:0)

感谢SilverNinja的建议。答案结果很简单: 从“服务”窗口启用分布式事务处理协调器(MSDTC)。