5

问题。在注册方案中,我试图在用户表中插入一个用户,然后为该用户调用WebSercurity.CreateAccount(在一个事务中)。这会导致MS DTC在服务器上不可用的错误。使用具有在TrasactionScope其​​他查询WebSercurity.CreateAccount,而不DTC启用

Description。我这样做的原因是因为我有一个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(); 
      //} 

回答

1

我发现了一个可能的解决方案,但我不知道这是否是最好的解决办法。这个想法来自于这个blog post,它说我们如何在我们的POCO实体中包含简单成员表并且自己创建表(不使用WebSecurity)。

因此,作为一个结果,我想我可以简单地通过webpages_UsersInRoles表中插入一条记录插入在webpages_Membership表中的记录,并AddUserToRole实现我的仓库中CreateAccount方法。 对于其他查询,如GetUser和...我们可以像以前一样使用WebSecurityRoles类。

看来工作正常(否则我想的东西),但有一些额外的工作要做,我希望不要!

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

1

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

SimpleMembership设计用于简单场景。你正在做一个高级场景,所以你应该使用不同的会员供应商。

+0

谢谢,是的,我知道,是不是有办法通过连接到'WebSecurity'方法? 你有什么建议会员供应商? – Ashkan 2013-02-22 01:19:54

0

由于Mystere Man指出错误发生是因为事务处理了两个不同的数据库。你有几个选择。这里有一些想到的。

您可以自定义使用的SimpleMembership提供商捕捉你想为每个用户定制信息的现有用户实体。这是相当简单的,并且是discussed in this blog post。它看起来像你正在尝试做的电子邮件确认该SimpleMembership供应商也支持并discussed here

您也可以使用唯一的用户ID(INT),其SimpleMembership使用配合你的其他数据库中的信息。一旦创建了用户和日志他们可以通过调用WebSecurity.CurrentUserId获得该ID。

您可以绕过整个SimpleMempership提供商,并创建自己的自定义成员资格提供,这是discussed here

+0

谢谢你的回答。 关于**选项1 **:我正在使用这种方法。我的用户实体有我需要的自定义信息,我的问题是我有两种类型的用户:客户和代理继承用户!关于**选项2 **的 **:我也在做这个!我的问题是别的(或者我没有明白你的观点!)。但链接有一些有用的信息。谢谢。 和约**选项3 **:我不想重新发明轮子。 – Ashkan 2013-02-22 21:39:51

相关问题