【发布时间】:2016-07-17 03:36:28
【问题描述】:
我正在尝试在 ASP.NET 5 应用程序中创建初始“超级用户”。在 MVC 6 / EF7 中使用最新的模板文件。
我可以按照此处列出的示例进行操作:
http://wildermuth.com/2015/3/17/A_Look_at_ASP_NET_5_Part_3_-_EF7
这很好 - 直到我尝试执行异步方法。例如:
await _userManager.CreateAsync(user, "P@55w0rd!");
甚至:
await _context.SaveChangesAsync();
同步方法可以正常工作,并且此代码也在Startup.cs Configure{...} 之外执行。
我在应用程序启动时收到“白屏死机”。我会在没有 async 的情况下完成这一切,但我认为 UserManager 在 Identity 3.0 中没有 Create()。
这是我不懂异步编程还是应该有可能?
编辑:添加了整个调用:
定义一个Seeder 类和一个创建用户的方法:
public class Seeder
{
private ApplicationDbContext _context;
private UserManager<ApplicationUser> _userManager;
public Seeder(
ApplicationDbContext context,
UserManager<ApplicationUser> userManager)
{
_context = context;
_userManager = userManager;
}
public async Task Seed()
{
await CreateUsersAsync();
}
public async Task CreateUsersAsync()
{
var user = await _userManager.FindByEmailAsync("superuser@superuser.com");
if (user == null)
{
var company = _context.Company.First(x => x.Name == "Acme Ltd");
user = new ApplicationUser
{
UserName = "superuser@superuser.com",
Email = "superuser@superuser.com",
CreatedDate = DateTime.Now,
IsActive = true,
CompanyID = company.CompanyId
};
await _userManager.CreateAsync(user, "P@55w0rd!!");
}
}
}
配置服务:
public void ConfigureServices(IServiceCollection services)
{
...
services.AddTransient<Seeder>();
...
}
叫它:
public async void Configure(Seeder seeder)
{
...
await seeder.Seed();
...
}
有趣的是;它确实创建了用户 - 它只是不会继续。所以第二次执行user != null,它执行得很好。
【问题讨论】:
-
能否将整个方法调用分享给
_userManager.CreateAsnyc?控制器代码是什么样的? -
我相信 UserManager 中的异步调用会返回一个 IdentityResult 对象,该对象指示该方法是否成功。在该对象中有一个 Result 属性,它包含您的用户。
标签: c# asp.net-mvc entity-framework async-await