我正在尝试在应用程序启动期间在Identity框架中播种"admin"帐户.我们的大部分应用程序都没有通过代码优先的Entity框架模型进行设置,因此我需要在不扩展其中一个IDatabaseInitializer类的情况下执行此操作.我使用与这些数据库优先模型相同的数据库.
这是一个ASP.NET MVC 5应用程序.
在Global.asax.cs,我有以下相关代码.
using (var context = new IdentityContext(EnvironmentSettings.Current.DatabaseConnections.CreateDbConnection("Extranet").ConnectionString))
{
context.SeedAdminAccount(EnvironmentSettings.DefaultAdminAccount.UserName, EnvironmentSettings.DefaultAdminAccount.Password).Wait();
}
Run Code Online (Sandbox Code Playgroud)
连接字符串是Azure SQL服务器.用户名是电子邮件地址,密码是一串字符,包括一声巨响.
IdentityContext类看起来像这样.
public class IdentityContext : IdentityDbContext<IdentityUser>
{
public IdentityContext(string connectionString) : base(connectionString)
{
Debug.WriteLine(connectionString);
Initialize();
}
void Initialize()
{
Database.Log = s => System.Diagnostics.Debug.WriteLine(s);
Database.SetInitializer<IdentityContext>(new CreateInitializer());
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Entity<IdentityUser>().ToTable("IdentityUser", "dbo");
modelBuilder.Entity<IdentityRole>().ToTable("IdentityRole", "dbo");
modelBuilder.Entity<IdentityUserClaim>().ToTable("IdentityUserClaim", "dbo");
modelBuilder.Entity<IdentityUserLogin>().ToTable("IdentityUserLogin", "dbo");
modelBuilder.Entity<IdentityUserRole>().ToTable("IdentityUserRole", "dbo");
}
}
Run Code Online (Sandbox Code Playgroud)
context.SeedAdminAccount()是...的延伸IdentityContext.看起来像这样.
public static class IdentityContextExtensions
{
public static async Task SeedAdminAccount(this …Run Code Online (Sandbox Code Playgroud) 我用一个控制器和一个方法创建了一个简单的WebApi项目:
public static class DoIt
{
public static async Task<string> GetStrAsync(Uri uri)
{
using (var client = new HttpClient())
{
var str = await client.GetStringAsync(uri);
return str;
}
}
}
public class TaskRunResultController : ApiController
{
public string Get()
{
var task = Task.Run(() =>
DoIt.GetStrAsync(new Uri("http://google.com"))
);
var result = task.Result;
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
我非常了解async/await和tasks; 斯蒂芬克莱里几乎虔诚地跟随他.只是存在.Result让我焦虑,我希望这会陷入僵局.我知道这Task.Run(...)很浪费,导致在等待异步DoIt()完成时占用一个线程.
问题是这不是死锁,而是让我心悸.
我看到一些答案,如/sf/answers/2282496401/,我也观察到SynchronizationContext.Currentlambda执行时为null.但是,我也有类似的问题,问为什么上面的代码会出现死锁,而且我发现死锁ConfigureAwait(false)是在使用(不捕获上下文)的情况下发生的.Result.
是什么赋予了?