在我的IDatabaseInitializer
Seed
方法之一中给出DbContext
我将初始数据插入到数据库中。除此之外还有一些用户要初始化。但是,如果Microsoft.AspNet.Identity.EntityFramework.UserStore
与Microsoft.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.
}
所以问题是,是否有一种方法可以在没有并发问题的情况下使用UserManager
和DbContext
?
我已尝试从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);
答案 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()的等待者,并获取结果。