我用ASP.NET MVC-5创建了一个新的Individual User Accounts应用程序,然后更新了解决方案中的所有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逻辑移到家庭控制器的索引方法中,并在运行应用程序后插入数据。我还需要将这一行: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);
}因此,现在创建了Admin角色,但是当到达var user = userManager.FindByName(name);时,应用程序将毫无例外地挂起,也没有任何消息.
发布于 2014-08-04 14:35:16
在使用迁移时,可以使用内置的初始化器和Seed方法:
Database.SetInitializer<ApplicationDbContext>(new
MigrateDatabaseToLatestVersion<ApplicationDbContext,
APPLICATION.Migrations.Configuration>());在APPLICATION.Migrations.Configuration中(这是由Enable-Migrations命令创建的):
protected override void Seed(ApplicationDbContext context)
{
// seed logic
}作为角色管理器,您还可以使用RoleManager<ApplicationRole>基本实现。
发布于 2014-12-21 17:36:01
在这种情况下,我也对挂起的应用程序感到有点困惑。这个问题可以这样解决。
var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUserManager>(db));
var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(db));发布于 2015-02-11 07:43:23
对于任何使用带有Integer外键的ApplicationUser的人,代码是这样的:
var userManager = new ApplicationUserManager(new ApplicationUserStore(context));
var roleManager = new ApplicationRoleManager(new ApplicationRoleStore(context));https://stackoverflow.com/questions/25120942
复制相似问题