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:我不想重新发明轮子。