Asp.net mvc 4 在未启用DTC的情况下,将WebSercurity.CreateCount与TrasactionScope中的其他查询一起使用

Asp.net mvc 4 在未启用DTC的情况下,将WebSercurity.CreateCount与TrasactionScope中的其他查询一起使用,asp.net-mvc-4,entity-framework-5,transactionscope,msdtc,simplemembership,Asp.net Mvc 4,Entity Framework 5,Transactionscope,Msdtc,Simplemembership,问题。在注册场景中,我试图在我的用户表中插入一个用户,然后为该用户(在事务中)调用WebSercurity.CreateAccount。这会导致错误,即MS DTC在服务器上不可用 说明。我这样做的原因是因为我有一个客户实体,它继承自用户,因此webserity.CreateUserAndAccount不能使用,因为它不知道客户,只插入一个用户记录 我将Asp.net MVC 4与EntityFramework 5、CodeFirst和SQL Server 2008 R2一起使用 任何不使用DT

问题。在注册场景中,我试图在我的用户表中插入一个用户,然后为该用户(在事务中)调用
WebSercurity.CreateAccount
。这会导致错误,即MS DTC在服务器上不可用

说明。我这样做的原因是因为我有一个
客户
实体,它继承自
用户
,因此
webserity.CreateUserAndAccount
不能使用,因为它不知道
客户
,只插入一个
用户
记录

我将Asp.net MVC 4与EntityFramework 5、CodeFirst和SQL Server 2008 R2一起使用

任何不使用DTC的建议都将不胜感激

编辑。 发生此错误的原因很明显,因为websecurity使用其自身到数据库的连接,而我的存储库使用另一个连接,尽管我已将simplemembership配置为使用与我的存储库相同的
DbContext
类,但问题是它创建了
DbContext
的新实例

我希望有没有一种方法可以传递一个现有的上下文对象,或者连接到
WebSecurity
来使用它的方法

代码如下:

        if (ModelState.IsValid)
        {
            //using (TransactionScope tx = new TransactionScope())
            //{
                UnitOfWork.UserRepository.Insert(new Customer
                {
                    FirstName = model.FirstName,
                    LastName = model.LastName,
                    Email = model.Email,
                    Tel = model.Tel,
                    Mobile = model.Mobile,
                    BirthDate = model.BirthDate,
                    InsertDate = DateTime.Now,
                    UserType = UserType.Customer,
                    MaritalStatus = model.MaritalStatus,
                    ZipCode = model.ZipCode,
                    StreetAddress = model.StreetAddress,
                    City = model.City,
                    State = model.State
                });
                UnitOfWork.Commit();

                string token = WebSecurity.CreateAccount(model.Email, model.Password, true);

                Roles.AddUserToRole(model.Email, "Customer");
                //WebSecurity.Login(model.Email, model.Password, true);

                await Task.Run(() => EmailHelper.SendConfrimationEmail(token, model.Email));

            //  tx.Complete();
            //}

发生DTC错误是因为您试图跨越两个不同数据库连接的事务。你有几个选择


SimpleMembership是为简单场景而设计的。您正在执行高级方案,因此您可能应该使用不同的会员资格提供商。

我找到了一个可能的解决方案,但我不确定它是否是最佳解决方案。这个想法来源于此,它告诉我们如何在POCO实体中包含simplemembership表,并自己创建表(不使用WebSecurity)

因此,我认为我可以在我的存储库中实现
CreateAccount
方法,只需在
webpages\u Membership
表中插入一条记录,然后在
webpages\u UsersInRoles
表中插入一条记录。 对于其他查询,如
GetUser
和。。。我们可以像以前一样使用
WebSecurity
Roles

它似乎工作正常(否则我错过了一些东西),但有一些额外的工作要做,我不希望


因此,如果有人能给我一个更好的解决方案,我会很高兴。

正如Mystere Man指出的那样,由于事务是在两个不同的数据库上进行的,所以出现了错误。你有几个选择。下面是我想到的一些

您可以自定义SimpleMembership提供程序使用的现有用户实体,以捕获每个用户所需的自定义信息。这是相当直接的,而且是非常简单的。看起来您正在尝试进行电子邮件确认,SimpleMembership提供程序也支持并正在进行此确认

您还可以将其他数据库中的信息与SimpleMembership使用的唯一用户ID(int)联系起来。创建用户并登录后,可以通过调用获取该id


您可以绕过整个SimpleMempership提供程序,创建自己的自定义成员资格提供程序。

谢谢,是的,我知道,没有办法传递到
WebSecurity
方法的连接吗?你有什么建议?谢谢你的回答。关于选项1:我正使用这种方法。我的
用户
实体有我需要的自定义信息,我的问题是我有两种类型的用户:客户和代理,whitch继承用户!关于选项2:我也在做这个!我的问题是别的(或者我没有明白你的意思!)。但是这个链接有一些有用的信息。谢谢关于选项3:我不想重新发明轮子。