【问题标题】:Creating Asp.net Identity user in Seed method of Db Initializer在 Db Initializer 的 Seed 方法中创建 Asp.net Identity 用户
【发布时间】:2014-12-16 06:39:58
【问题描述】:

我首先使用 EF 6 代码创建了我的数据层,并通过继承自 DropCreateDatabaseIfModelChangesEvInitializer 类的 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
应用程序无限期挂起

【问题讨论】:

    标签: entity-framework entity-framework-6 asp.net-identity asp.net-identity-2


    【解决方案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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-16
      • 2014-08-29
      • 2013-12-31
      • 2017-08-09
      • 2014-04-23
      • 2019-07-07
      • 2014-03-07
      • 2014-08-12
      相关资源
      最近更新 更多