如何同步使用UserManager?

Art*_*yom 11 c# entity-framework asp.net-identity

在我的一个IDatabaseInitializerSeed方法给我DbContext我插入初始数据到数据库.除此之外还有一些用户要初始化.但据我使用Microsoft.AspNet.Identity.EntityFramework.UserStoreMicrosoft.AspNet.Identity.UserManager它有只有它使异步方法DbUpdateConcurrencyException如下:

private static void CreateUser(DbContext context, string[] roles, string userName, string userEmail) {

    // given context is 
    var user = new ApplicationUser { /* ... fields init */  };

    var userStoreAdapter = new ApplicationUserRepository(context);
    var manager = new UserManager<ApplicationUser>(userStoreAdapter);

    // pass the creation to manager by calling it synchronously. See UserManagerExtensions
    manager.Create(user, Domain.Constants.DefaultPassword);
    manager.AddToRoles(user.Id, roles);

    context.SaveChanges(); // throws DbUpdateConcurrencyException. See another approach below.
}
Run Code Online (Sandbox Code Playgroud)

所以问题是,如果没有并发问题,UserManagerDbContext没有办法使用?

我尝试了从乐观并发模式采取的以下方法,但不创建用户:

bool isSaved = true;
do
{
    try
    {
        context.SaveChanges();
        isSaved = true;
    }
    catch (DbUpdateConcurrencyException ex)
    {
        foreach (var entry in ex.Entries)
        {
            entry.Reload();
        }
        isSaved = false;
    }
} while (!isSaved);
Run Code Online (Sandbox Code Playgroud)

Pha*_*ubu -1

要同步使用UserManager,您需要从 System.Threading.Tasks 调用.GetAwaiter().GetResult()扩展方法。例如使用用户管理器同步获取当前用户:

using System.Threading.Tasks;
var currentUser = _userManager.GetUserAsync(User).GetAwaiter().GetResult();
Run Code Online (Sandbox Code Playgroud)

System.Threading.Tasks 命名空间中的这两个扩展方法获取任务GetUsersAsync()的等待者并获取结果。