了解MVC-5身份

我使用Individual User Accounts创建了一个新的ASP.NET MVC-5应用程序,然后更新了解决方案中的所有Nuget packages 。 现在我试图遵循一些教程中显示的一些指导原则,但我遇到了一些问题。 第一个是没有创建在整个应用程序中使用的名为ApplicationRoleManager的类( ApplicationUserManager已创建)。 第二个问题更多的是关于Entity-Framework :我已经看到,为了用一个用户和角色播种数据库,许多人在ApplicationDbContext类中创建一个静态构造函数:

  static ApplicationDbContext() { Database.SetInitializer(new ApplicationDbInitializer()); } 

所以我添加了它, ApplicationDbInitializer的实现是:

 public class ApplicationDbInitializer : DropCreateDatabaseIfModelChanges { protected override void Seed(ApplicationDbContext context) { InitializeIdentityForEF(context); base.Seed(context); } //Create User=Admin@Admin.com with password=Admin@123456 in the Admin role public static void InitializeIdentityForEF(ApplicationDbContext db) { var userManager = HttpContext.Current.GetOwinContext().GetUserManager(); var roleManager = HttpContext.Current.GetOwinContext().Get(); const string name = "admin@admin.com"; const string password = "Admin@123456"; const string roleName = "Admin"; //Create Role Admin if it does not exist var role = roleManager.FindByName(roleName); if (role == null) { role = new IdentityRole(roleName); var roleresult = roleManager.Create(role); } var user = userManager.FindByName(name); if (user == null) { user = new ApplicationUser { UserName = name, Email = name }; var result = userManager.Create(user, password); result = userManager.SetLockoutEnabled(user.Id, false); } // Add user admin to Role Admin if not already added var rolesForUser = userManager.GetRoles(user.Id); if (!rolesForUser.Contains(role.Name)) { var result = userManager.AddToRole(user.Id, role.Name); } } 

添加完所有内容后,我打开了Package Manager Console并键入了Enable-Migrations ,然后Add-Migration someName ,然后是Update-Database 。 结果是数据库已成功创建,但没有数据插入数据库。
注意到未插入数据后,我将Seed逻辑移动到主控制器的Index方法,并在运行应用程序后插入数据。 我还需要添加以下行: app.CreatePerOwinContext(ApplicationRoleManager.Create);Startup.Auth.cs文件。
所以我的问题是:

  1. 我真的需要手动输入ApplicationRoleManager类吗?
  2. 如何使seed方法有效?

UPDATE
我已将Seed方法更改为:

 protected override void Seed(ApplicationDbContext context) { var userManager = HttpContext.Current.GetOwinContext().GetUserManager(); //since there is no ApplicationRoleManager (why is that?) this is how i create it var roleManager = new RoleManager(new RoleStore(context)); const string name = "admin@admin.com"; const string password = "Admin@123456"; const string roleName = "Admin"; //Create Role Admin if it does not exist var role = roleManager.FindByName(roleName); if (role == null) { role = new IdentityRole(roleName); var roleresult = roleManager.Create(role); } //app hangs here... var user = userManager.FindByName(name); if (user == null) { user = new ApplicationUser { UserName = name, Email = name }; var result = userManager.Create(user, password); result = userManager.SetLockoutEnabled(user.Id, false); } // Add user admin to Role Admin if not already added var rolesForUser = userManager.GetRoles(user.Id); if (!rolesForUser.Contains(role.Name)) { var result = userManager.AddToRole(user.Id, role.Name); } base.Seed(context); } 

所以现在,创建了Admin角色,但是在获取var user = userManager.FindByName(name); 应用程序挂起,没有例外或任何消息……

使用迁移时,您可以使用内置初始化程序和Seed方法:

 Database.SetInitializer(new MigrateDatabaseToLatestVersion()); 

APPLICATION.Migrations.Configuration (这是由Enable-Migrations命令创建的):

 protected override void Seed(ApplicationDbContext context) { // seed logic } 

作为角色管理器,您还可以使用RoleManager基础实现。

在这种情况下,我也对悬挂应用程序感到有些困惑。 这个问题可以通过这种方式解决

 var userManager = new UserManager(new UserStore(db)); var roleManager = new RoleManager(new RoleStore(db)); 

对于任何使用带有Integer外键的ApplicationUser的人来说,代码是这样的:

 var userManager = new ApplicationUserManager(new ApplicationUserStore(context)); var roleManager = new ApplicationRoleManager(new ApplicationRoleStore(context)); 

这适用于默认的MVC 5项目。

 var manager = new ApplicationUserManager(new UserStore(context)); 

发布的解决方案似乎并未解决在userManager.FindByName(name)调用时userManager.FindByName(name)的应用程序问题。 我遇到了同样的问题。 它几个小时前就在我当地工作了。 我发布到Azure,它开始挂起。 当我再次测试我的本地时,它突然开始挂在那一步。 没有错误返回且没有超时(至少等待10-15分钟后)。 有没有人有任何提示来解决Yoav的终极问题?

我有一些其他非常简单的种子进程在添加角色之前运行,并且db.Foo.AddOrUpdate(foo)调用正在运行而没有错误,但实际上没有将任何内容保存到数据库。

我只是花了一个非常不愉快的半天来处理这件事。 我终于设法得到该死的东西:

 public static void InitializeIdentityForEF(ApplicationDbContext context) { context.Configuration.LazyLoadingEnabled = true; //var userManager = HttpContext.Current // .GetOwinContext().GetUserManager(); //var roleManager = HttpContext.Current // .GetOwinContext().Get(); var roleStore = new RoleStore(context); var roleManager = new RoleManager(roleStore); var userStore = new UserStore(context); var userManager = new UserManager(userStore); ... 

这是一个非常漫长的一天的结束,我怀疑有人会告诉我为什么我不应该这样做。 然而,我的Seed方法的其余部分使用非异步方法(FindByName / Create)进行精美的激发。

goobering先生,你的挣扎帮助我解决了这个问题,但我不得不这样做有点不同。

  context.Configuration.LazyLoadingEnabled = true; //var userManager = HttpContext.Current.GetOwinContext().GetUserManager(); //var roleManager = HttpContext.Current.GetOwinContext().Get(); const string name = "admin@example.com"; const string password = "Admin@123456"; const string roleName = "Admin"; ***var userManager = new ApplicationUserManager(new UserStore(context)); var roleManager = new ApplicationRoleManager(new RoleStore(context));*** //Create Role Admin if it does not exist var role = roleManager.FindByName(roleName); if (role == null) { role = new IdentityRole(roleName); var roleresult = roleManager.Create(role); }