【发布时间】:2015-12-27 03:13:05
【问题描述】:
在给定我的DbContext 的Seed 方法中,我的IDatabaseInitializer 之一将初始数据插入数据库。除其他外,还有一些用户需要初始化。但就我使用 Microsoft.AspNet.Identity.EntityFramework.UserStore 和 Microsoft.AspNet.Identity.UserManager 而言,它具有 only 异步方法,它使 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);
【问题讨论】:
-
我认为您的问题可以分解为“如何从同步方法调用异步方法?”如果是这样,这可能会对您有所帮助:stackoverflow.com/questions/22628087/…
-
@NathanA
Task总是在另一个线程中运行,对吧?所以UserManager更新数据库,而给定的DbContext不知道它。它与上述并发异常中断。那么我可以在当前线程中运行它吗?该帖子看起来没有帮助。由UserManager的扩展方法调用的AsyncHelper执行类似的操作。 -
我相信我也有同样的问题。在我的情况下,客户端启动了一个冗长的数据库脚本,服务器的响应是 200 OK。但是在漫长的过程完成后,我尝试运行 _RoleManager.CreateAsync 并且没有任何反应。你找到工作了吗? @Artyom?
标签: c# entity-framework asp.net-identity