如何同步使用UserManager?

时间:2015-09-29 14:59:04

标签: c# entity-framework asp.net-identity

在我的IDatabaseInitializer Seed方法之一中给出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.
}

所以问题是,是否有一种方法可以在没有并发问题的情况下使用UserManagerDbContext

我已尝试从Optimistic Concurrency Patterns采取以下方法,但不会创建用户:

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

2 个答案:

答案 0 :(得分:0)

var result = Task.Run(() => {
   /*whatever you want here*/
}).Result;

// Do whatever u want with the result after

答案 1 :(得分:-1)

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

using System.Threading.Tasks;
var currentUser = _userManager.GetUserAsync(User).GetAwaiter().GetResult();

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