【发布时间】:2014-09-27 01:26:52
【问题描述】:
我使用Individual User Accounts 创建了一个新的ASP.NET MVC-5 应用程序,然后更新了解决方案中的所有Nuget packages。现在我正在尝试遵循一些教程中显示的一些指导方针,但我遇到了一些问题。
第一个是没有创建在整个应用程序中使用的名为ApplicationRoleManager 的类(创建了ApplicationUserManager)。
第二个问题更多地是关于Entity-Framework:我已经看到很多人在ApplicationDbContext 类中为数据库播种用户和角色创建了一个静态构造函数:
static ApplicationDbContext()
{
Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());
}
所以我加了,ApplicationDbInitializer的实现是:
public class ApplicationDbInitializer : DropCreateDatabaseIfModelChanges<ApplicationDbContext>
{
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<ApplicationUserManager>();
var roleManager = HttpContext.Current.GetOwinContext().Get<ApplicationRoleManager>();
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>(ApplicationRoleManager.Create);
添加到Startup.Auth.cs 文件中。
所以我的问题是:
- 我真的需要进入
ApplicationRoleManager类吗 手动? - 如何使
seed方法起作用?
更新
我已将Seed 方法更改为:
protected override void Seed(ApplicationDbContext context)
{
var userManager = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
//since there is no ApplicationRoleManager (why is that?) this is how i create it
var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(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);
}
所以现在,管理员角色已创建,但是当到达 var user = userManager.FindByName(name); 时,应用程序挂起,没有任何异常或任何消息...
【问题讨论】:
标签: c# asp.net-mvc entity-framework asp.net-mvc-5 asp.net-identity-2