在 Db Initializer 的 Seed 方法中创建 Asp.net Identity 用户
Posted
技术标签:
【中文标题】在 Db Initializer 的 Seed 方法中创建 Asp.net Identity 用户【英文标题】:Creating Asp.net Identity user in Seed method of Db Initializer 【发布时间】:2014-12-16 06:39:58 【问题描述】:我首先使用 EF 6 代码创建了我的数据层,并通过继承自 DropCreateDatabaseIfModelChanges
的 EvInitializer
类的 Seed
方法填充数据库。 Seed
方法的实现是
protected override void Seed(EvContext context)
//Add other entities using context methods
ApplicationUserManager manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context));
var user = new ApplicationUser Email = "admin@myemail.com" ,UserName = "admin@myemail.com";
var result = await manager.CreateAsync(user, "Temp_123");//this line gives error. obviously await cannot be used in non- async method and I cannot make Seed async
我的问题是如何使用UserManager
类在Seed
方法中添加用户。当我改变
var result = awit manager.CreateAsync(user, "Temp_123");
到var result = manager.CreateAsync(user, "Temp_123").Result; //or .Wait
应用程序无限期挂起
【问题讨论】:
【参考方案1】:在 asp.net-identity-2 中,用户管理器有非异步方法来创建。
var user = new ApplicationUser Email = "admin@myemail.com", UserName = "admin@myemail.com" ;
manager.Create(user, "Temp_123");
如果你想创建“管理员”角色,rolemanager 也是如此。
var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context));
roleManager.Create(new Role("admin"));
使用户成为管理员
manager.AddToRole(user.Id, "admin");
编辑:正如 trailmax 评论的那样,Create()
扩展方法带有 Microsoft.AspNet.Identity
命名空间,所以不要忘记 using Microsoft.AspNet.Identity
【讨论】:
没有manager.Create
方法。我检查了我安装的 nuget 包,我有 Microsoft.AspNet.Identity.Core
的 2.1.0 版本。有什么想法吗?
我的项目中也有 2.1.0 版本,我可以导航到这两种扩展方法。也许尝试重新安装软件包
使用Update-Package -reinstall Microsoft.AspNet.Identity.Core
重新安装了软件包,但ApplicationUserManager
中仍然没有创建用户的同步方法。我正在将 Identity 与 Web api 一起使用,如果这很重要?
类的同步版本是来自Microsoft.AspNet.Identity.UserManagerExtensions
类的扩展方法。检查您的命名空间导入。
这行得通。奇怪的是,创建将不允许用户名中的空格,并且失败且没有错误。更奇怪的是,在 AccountsController 的 Register 方法中使用的 CreateAsync 确实允许空格。【参考方案2】:
TMG 是正确的 - 有可用的非异步方法,这是在这种特殊情况下最简单的方法。
但是,一般来说 - 当您只有一个异步版本的函数可供您使用,并且您不能将方法的实现更改为异步时 - 您可以创建一个任务并同步等待它。
所以 - 而不是:
IdentityResult result = await manager.CreateAsync(user, "Temp_123");
你可以编码:
Task<IdentityResult> createTask = manager.CreateAsync(user, "Temp_123");
createTask.Wait();
一旦等待完成,IdentityResult 会在
中返回createTask.Result
您还可以在等待上设置超时,如下所示:
Task<IdentityResult> createTask = manager.CreateAsync(user, "Temp_123");
if (!createTask.Wait(5000)) // Wait up to 5 seconds
// We've timed out waiting - Do some error handling
else if (!createTask.Result.Succeeded)
// Creating the user failed - Do some error handling
【讨论】:
以上是关于在 Db Initializer 的 Seed 方法中创建 Asp.net Identity 用户的主要内容,如果未能解决你的问题,请参考以下文章
Entity Framework Code-First(18):Turn off DB Initializer
您如何在 AWS Elastic Beanstalk 应用程序上调用 db:seed?