gpt4 book ai didi

c# - MVC 5 IdentityDbContext 和 DbContext 事务

转载 作者:太空宇宙 更新时间:2023-11-03 13:11:57 25 4
gpt4 key购买 nike

我在一个使用 EF6.1 的 MVC 5 项目上工作。作为初学者,我尽量保留由 MVC 5 模板生成的代码,以便使用带有 AccountController 的默认身份验证系统。但是,我必须添加一些类,例如下面的“User.cs”,所以我使用的是 Entity Framework 数据模型。

public partial class User
{
public User()
{
this.Logs= new HashSet<Log>();
}

public int IdUser { get; set; }
public string AspNetUsersId { get; set; } //References to AspNetUsers.Id
public string Title { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Job{ get; set; }

public virtual ICollection<Log> Logs { get; set; }
}

所以,我有两个上下文:

public partial class MyEFDataModelContainer : DbContext
{
public MyEFDataModelContainer ()
: base("name=MyEFDataModelContainer")
{
}

public DbSet<User> Users { get; set; }
}
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection")
{
}
}

所以,我的方案是我需要创建一个 AspNetUsers,然后向这个 AspNetUsers 添加一个 AspNetRoles,然后创建一个用户。我们假设 AspNetUsers 创建和 AspNetRoles 有效,但如果用户创建失败,我该如何回滚 AspNetUsers 和 AspNetRoles?

我可以用这两个上下文创建事务吗?

不幸的是,我还需要调用 WCF webservices 来执行这个任务?我能做什么?

最好的问候,

已更新

我的合并上下文:

public partial class User: IdentityUser { }
public partial class MyEFDataModelContainer : IdentityDbContext<User>
{
public MyEFDataModelContainer() : base("name=MyEFDataModelContainer")
{ }
}

我的 AccountController.cs:

public class AccountController : Controller
{
public AccountController()
{
UserManager =new UserManager<User>(new UserStore<User>(new MyEFDataModelContainer()))
}
public UserManager<User> UserManager {get;set;}
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
var user = new USER() { UserName = model.UserName, Email = model.Email, PhoneNumber = model.Phone };
var result = await UserManager.CreateAsync(user, model.Password);
var role = await UserManager.AddToRoleAsync(user.Id, "Membre");
if (result.Succeeded)
{
using (UserBusiness business = new UserBusiness())
{
var userResult = business.AddUser(model.FirstName, model.LastName, user.Id);
}

await SignInAsync(user, isPersistent: false);
return RedirectToAction("Index", "Home");
}
else
{
AddErrors(result);
}
}
return View(model);
}
}

我的 Web.config :

<connectionStrings>    
<add name="MyEFDataModelContainer" connectionString="metadata=res://*/MyEFDataModel.csdl|res://*/MyEFDataModel.ssdl|res://*/MyEFDataModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=localhost;initial catalog=DB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
</connectionStrings>

但现在,我遇到了错误 The specified type member ' UserName ' is not supported in LINQ to Entities 。仅支持初始化程序、实体成员和实体导航属性。在以下行中:

var result = await UserManager.CreateAsync(user, model.Password);

最佳答案

那么,我的第一个问题是,为什么需要两个上下文? aspnet 表必须与业务表分开是有原因的吗?

你能不能做这样的事情:

public partial class MyEFDataModelContainer : IdentityDbContext<User>
{
public MyEFDataModelContainer ()
: base("name=MyEFDataModelContainer")
{
}

public DbSet<User> Users { get; set; }
}

确保您的自定义用户类继承自 IdentityUser。

public partial class User : IdentityUser
{
public User()
{
this.Logs= new HashSet<Log>();
}

public int IdUser { get; set; }
public string AspNetUsersId { get; set; } //References to AspNetUsers.Id
public string Title { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Job{ get; set; }

public virtual ICollection<Log> Logs { get; set; }
}

然后,将您的 AccountController 更改为此连接字符串。这样一切都在同一个数据库中。

public class AccountController : Controller
{
public AccountController()
: this(new UserManager<User>(
new UserStore<User>(new MyEFDataModelContainer())))
{
}
}

虽然,要回答您的问题,是的,您可以将对两个上下文的访问包装在一个事务中。但是,您将不得不处理 MSDTC,根据我的经验,这有时会令人沮丧。

关于c# - MVC 5 IdentityDbContext 和 DbContext 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28149599/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com