将WebSercurity.CreateAccount与TrasactionScope中的其他查询一起使用,而不启用DTC

Ash*_*kan 5 msdtc transactionscope asp.net-mvc-4 entity-framework-5 simplemembership

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

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

我正在使用带有EntityFramework 5,CodeFirst和SQL Server 2008 R2的Asp.net MVC 4.

任何不使用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();
            //}
Run Code Online (Sandbox Code Playgroud)

Ash*_*kan 1

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

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

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

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