5

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

描述。我这样做的原因是因为我有一个Customer继承自的实体User,所以WebSercurity.CreateUserAndAccount不能使用,因为它不知道Customer并且只是插入一条User记录。

我将 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();
            //}
4

3 回答 3

1

我找到了一个可能的解决方案,但我不确定它是否是最好的解决方案。这个想法来自这篇博客文章,该文章说我们如何在我们的 POCO 实体中包含简单的成员表并自己创建表(不使用 WebSecurity)。

因此,我认为我可以通过简单地在表中插入一条记录并在表CreateAccount中插入一条记录来在我的存储库中实现该方法。对于像and ... 这样的其他查询,我们可以像以前一样使用and类。webpages_MembershipAddUserToRolewebpages_UsersInRolesGetUserWebSecurityRoles

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

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

于 2013-02-22T18:10:24.277 回答
1

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

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

于 2013-02-22T00:47:52.430 回答
0

正如 Mystere Man 指出的那样,由于事务在两个不同的数据库上,所以正在发生错误。你有几个选择。这里有一些我想到的。

您可以自定义 SimpleMembership 提供程序使用的现有 User 实体,以便为每个用户捕获您想要的自定义信息。这是相当简单的,并在此博客文章中进行了讨论。看起来您正在尝试发送电子邮件确认,SimpleMembership 提供商也支持并在此处讨论

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

您可以绕过整个 SimpleMempership 提供程序并创建您自己的自定义成员资格提供程序,这将在此处进行讨论

于 2013-02-22T18:36:59.973 回答