通过中间件管道播种数据库引发异常 asp.net 核心
Seeding database via middleware pipeline throws an exception asp.net core
我的解决方案有 3 层。 Core、BLL 和 DAL 层。所有都是 class 库,核心层除外,它是一个网络 API 层。 DAL 层具有上下文、播种器、迁移、实体和存储库 classes。我为核心层使用 ASP.NET Core 3.0 Preview,为 class 库层使用 .net standard 2.0。播种器 class 中的 Seed 方法是异步返回任务的。当核心项目是 运行 时,我得到这个异常:
当我删除 .Wait() 方法调用时,没有抛出异常并且 API 工作正常,但数据库没有种子。
我该如何解决这个问题?谢谢
Startup.cs 中间件管道:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, BlazeMartDbSeeder seeder)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
//throws exception here
seeder.Seed().Wait();
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
播种机class:
using BlazeMartManagementSystem.DAL.Entities;
using Microsoft.AspNetCore.Identity;
using System;
using System.Collections.Generic;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;
namespace BlazeMartManagementSystem.DAL
{
public class BlazeMartDbSeeder
{
private RoleManager<IdentityRole> _roleMgr;
private UserManager<ApplicationUser> _userMgr;
public BlazeMartDbSeeder(UserManager<ApplicationUser> userMgr, RoleManager<IdentityRole> roleMgr)
{
_userMgr = userMgr;
_roleMgr = roleMgr;
}
public async Task Seed()
{
var user = await _userMgr.FindByNameAsync("Raj");
// Add User
if (user == null)
{
if (!(await _roleMgr.RoleExistsAsync("Manager")))
{
var role = new IdentityRole("Manager");
await _roleMgr.AddClaimAsync(role, new Claim(type: "IsManager", value: "True"));
await _roleMgr.CreateAsync(role);
// role.Claims.Add(new IdentityRoleClaim<string>() { ClaimType = "IsManager", ClaimValue = "True" });
}
user = new ApplicationUser
{
UserName = "raj",
FirstName = "Raj",
LastName = "Narayanan",
Email = "raj@raj.com"
};
var userResult = await _userMgr.CreateAsync(user, "Asp3raj");
var roleResult = await _userMgr.AddToRoleAsync(user, "Manager");
var claimResult = await _userMgr.AddClaimAsync(user, new Claim("GreenBadge", "True"));
if (!userResult.Succeeded || !roleResult.Succeeded || !claimResult.Succeeded)
{
throw new InvalidOperationException("Failed to build user and roles");
}
}
user = await _userMgr.FindByNameAsync("Shawnw");
// Add User
if (user == null)
{
if (!(await _roleMgr.RoleExistsAsync("Employee")))
{
var role = new IdentityRole("Employee");
await _roleMgr.AddClaimAsync(role, new Claim(type: "IsEmployee", value: "True"));
await _roleMgr.CreateAsync(role);
// role.Claims.Add(new IdentityRoleClaim<string>() { ClaimType = "IsManager", ClaimValue = "True" });
}
user = new ApplicationUser
{
UserName = "shawnw",
FirstName = "Shawn",
LastName = "Wildermuth",
Email = "shawnw@s.com"
};
var userResult = await _userMgr.CreateAsync(user, "P@ssw0rd!");
var roleResult = await _userMgr.AddToRoleAsync(user, "Employee");
var claimResult = await _userMgr.AddClaimAsync(user, new Claim("OrangeBadge", "True"));
if (!userResult.Succeeded || !roleResult.Succeeded || !claimResult.Succeeded)
{
throw new InvalidOperationException("Failed to build user and roles");
}
}
user = await _userMgr.FindByNameAsync("John");
// Add User
if (user == null)
{
if (!(await _roleMgr.RoleExistsAsync("Vendor")))
{
var role = new IdentityRole("Vendor");
await _roleMgr.AddClaimAsync(role, new Claim(type: "IsVendor", value: "True"));
await _roleMgr.CreateAsync(role);
// role.Claims.Add(new IdentityRoleClaim<string>() { ClaimType = "IsManager", ClaimValue = "True" });
}
user = new ApplicationUser
{
UserName = "johng",
FirstName = "John",
LastName = "Galli",
Email = "gali@gali.com"
};
var userResult = await _userMgr.CreateAsync(user, "P@ssw0rd!");
var roleResult = await _userMgr.AddToRoleAsync(user, "Vendor");
var claimResult = await _userMgr.AddClaimAsync(user, new Claim("BlueBadge", "True"));
if (!userResult.Succeeded || !roleResult.Succeeded || !claimResult.Succeeded)
{
throw new InvalidOperationException("Failed to build user and roles");
}
}
}
}
}
您可以尝试像下面这样定义播种机 class :
public static class BlazeMartDbSeeder
{
public static void Seed(UserManager<ApplicationUser> userMgr, RoleManager<IdentityRole> roleMgr)
{
//var user = userMgr.FindByNameAsync("Raj");
// Add User
if (userMgr.FindByNameAsync("Raj").Result == null)
{
if (!( roleMgr.RoleExistsAsync("Manager").Result))
{
IdentityRole role = new IdentityRole();
role.Name = "Manager";
IdentityResult result = roleMgr.CreateAsync(role).Result;
IdentityResult claim=roleMgr.AddClaimAsync(role, new Claim(type: "IsManager", value: "True")).Result;
// role.Claims.Add(new IdentityRoleClaim<string>() { ClaimType = "IsManager", ClaimValue = "True" });
}
ApplicationUser user = new ApplicationUser
{
UserName = "raj",
FirstName = "Raj",
LastName = "Narayanan",
Email = "raj@raj.com"
};
IdentityResult userResult = userMgr.CreateAsync(user, "Asp3raj#").Result;
IdentityResult roleResult = userMgr.AddToRoleAsync(user, "Manager").Result;
IdentityResult claimResult = userMgr.AddClaimAsync(user, new Claim("GreenBadge", "True")).Result;
if (!userResult.Succeeded || !roleResult.Succeeded || !claimResult.Succeeded)
{
throw new InvalidOperationException("Failed to build user and roles");
}
}
//user = userMgr.FindByNameAsync("Shawnw");
// Add User
if (userMgr.FindByNameAsync("Shawnw").Result == null)
{
if (!(roleMgr.RoleExistsAsync("Employee").Result))
{
IdentityRole role = new IdentityRole();
role.Name = "Employee";
IdentityResult result=roleMgr.CreateAsync(role).Result;
IdentityResult claim =roleMgr.AddClaimAsync(role, new Claim(type: "IsEmployee", value: "True")).Result;
// role.Claims.Add(new IdentityRoleClaim<string>() { ClaimType = "IsManager", ClaimValue = "True" });
}
ApplicationUser user = new ApplicationUser
{
UserName = "shawnw",
FirstName = "Shawn",
LastName = "Wildermuth",
Email = "shawnw@s.com"
};
IdentityResult userResult = userMgr.CreateAsync(user, "P@ssw0rd!").Result;
IdentityResult roleResult = userMgr.AddToRoleAsync(user, "Employee").Result;
IdentityResult claimResult = userMgr.AddClaimAsync(user, new Claim("OrangeBadge", "True")).Result;
if (!userResult.Succeeded || !roleResult.Succeeded || !claimResult.Succeeded)
{
throw new InvalidOperationException("Failed to build user and roles");
}
}
// user = userMgr.FindByNameAsync("John");
// Add User
if (userMgr.FindByNameAsync("John").Result == null)
{
if (!(roleMgr.RoleExistsAsync("Vendor").Result))
{
IdentityRole role = new IdentityRole();
role.Name = "Vendor";
IdentityResult result = roleMgr.CreateAsync(role).Result;
IdentityResult claim= roleMgr.AddClaimAsync(role, new Claim(type: "IsVendor", value: "True")).Result;
// role.Claims.Add(new IdentityRoleClaim<string>() { ClaimType = "IsManager", ClaimValue = "True" });
}
ApplicationUser user = new ApplicationUser
{
UserName = "johng",
FirstName = "John",
LastName = "Galli",
Email = "gali@gali.com"
};
IdentityResult userResult = userMgr.CreateAsync(user, "P@ssw0rd!").Result;
IdentityResult roleResult = userMgr.AddToRoleAsync(user, "Vendor").Result;
IdentityResult claimResult = userMgr.AddClaimAsync(user, new Claim("BlueBadge", "True")).Result;
if (!userResult.Succeeded || !roleResult.Succeeded || !claimResult.Succeeded)
{
throw new InvalidOperationException("Failed to build user and roles");
}
}
}
}
Startup.cs
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, UserManager<ApplicationUser> userMgr, RoleManager<IdentityRole> roleMgr)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
BlazeMartDbSeeder.Seed(userMgr, roleMgr);
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
注意:密码的组成部分包含大小写字母、数字和特殊符号。
关于ASP.NET Core Identity中的种子用户和角色数据,您可以参考here。
我的解决方案有 3 层。 Core、BLL 和 DAL 层。所有都是 class 库,核心层除外,它是一个网络 API 层。 DAL 层具有上下文、播种器、迁移、实体和存储库 classes。我为核心层使用 ASP.NET Core 3.0 Preview,为 class 库层使用 .net standard 2.0。播种器 class 中的 Seed 方法是异步返回任务的。当核心项目是 运行 时,我得到这个异常:
当我删除 .Wait() 方法调用时,没有抛出异常并且 API 工作正常,但数据库没有种子。
我该如何解决这个问题?谢谢
Startup.cs 中间件管道:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, BlazeMartDbSeeder seeder)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
//throws exception here
seeder.Seed().Wait();
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
播种机class:
using BlazeMartManagementSystem.DAL.Entities;
using Microsoft.AspNetCore.Identity;
using System;
using System.Collections.Generic;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;
namespace BlazeMartManagementSystem.DAL
{
public class BlazeMartDbSeeder
{
private RoleManager<IdentityRole> _roleMgr;
private UserManager<ApplicationUser> _userMgr;
public BlazeMartDbSeeder(UserManager<ApplicationUser> userMgr, RoleManager<IdentityRole> roleMgr)
{
_userMgr = userMgr;
_roleMgr = roleMgr;
}
public async Task Seed()
{
var user = await _userMgr.FindByNameAsync("Raj");
// Add User
if (user == null)
{
if (!(await _roleMgr.RoleExistsAsync("Manager")))
{
var role = new IdentityRole("Manager");
await _roleMgr.AddClaimAsync(role, new Claim(type: "IsManager", value: "True"));
await _roleMgr.CreateAsync(role);
// role.Claims.Add(new IdentityRoleClaim<string>() { ClaimType = "IsManager", ClaimValue = "True" });
}
user = new ApplicationUser
{
UserName = "raj",
FirstName = "Raj",
LastName = "Narayanan",
Email = "raj@raj.com"
};
var userResult = await _userMgr.CreateAsync(user, "Asp3raj");
var roleResult = await _userMgr.AddToRoleAsync(user, "Manager");
var claimResult = await _userMgr.AddClaimAsync(user, new Claim("GreenBadge", "True"));
if (!userResult.Succeeded || !roleResult.Succeeded || !claimResult.Succeeded)
{
throw new InvalidOperationException("Failed to build user and roles");
}
}
user = await _userMgr.FindByNameAsync("Shawnw");
// Add User
if (user == null)
{
if (!(await _roleMgr.RoleExistsAsync("Employee")))
{
var role = new IdentityRole("Employee");
await _roleMgr.AddClaimAsync(role, new Claim(type: "IsEmployee", value: "True"));
await _roleMgr.CreateAsync(role);
// role.Claims.Add(new IdentityRoleClaim<string>() { ClaimType = "IsManager", ClaimValue = "True" });
}
user = new ApplicationUser
{
UserName = "shawnw",
FirstName = "Shawn",
LastName = "Wildermuth",
Email = "shawnw@s.com"
};
var userResult = await _userMgr.CreateAsync(user, "P@ssw0rd!");
var roleResult = await _userMgr.AddToRoleAsync(user, "Employee");
var claimResult = await _userMgr.AddClaimAsync(user, new Claim("OrangeBadge", "True"));
if (!userResult.Succeeded || !roleResult.Succeeded || !claimResult.Succeeded)
{
throw new InvalidOperationException("Failed to build user and roles");
}
}
user = await _userMgr.FindByNameAsync("John");
// Add User
if (user == null)
{
if (!(await _roleMgr.RoleExistsAsync("Vendor")))
{
var role = new IdentityRole("Vendor");
await _roleMgr.AddClaimAsync(role, new Claim(type: "IsVendor", value: "True"));
await _roleMgr.CreateAsync(role);
// role.Claims.Add(new IdentityRoleClaim<string>() { ClaimType = "IsManager", ClaimValue = "True" });
}
user = new ApplicationUser
{
UserName = "johng",
FirstName = "John",
LastName = "Galli",
Email = "gali@gali.com"
};
var userResult = await _userMgr.CreateAsync(user, "P@ssw0rd!");
var roleResult = await _userMgr.AddToRoleAsync(user, "Vendor");
var claimResult = await _userMgr.AddClaimAsync(user, new Claim("BlueBadge", "True"));
if (!userResult.Succeeded || !roleResult.Succeeded || !claimResult.Succeeded)
{
throw new InvalidOperationException("Failed to build user and roles");
}
}
}
}
}
您可以尝试像下面这样定义播种机 class :
public static class BlazeMartDbSeeder
{
public static void Seed(UserManager<ApplicationUser> userMgr, RoleManager<IdentityRole> roleMgr)
{
//var user = userMgr.FindByNameAsync("Raj");
// Add User
if (userMgr.FindByNameAsync("Raj").Result == null)
{
if (!( roleMgr.RoleExistsAsync("Manager").Result))
{
IdentityRole role = new IdentityRole();
role.Name = "Manager";
IdentityResult result = roleMgr.CreateAsync(role).Result;
IdentityResult claim=roleMgr.AddClaimAsync(role, new Claim(type: "IsManager", value: "True")).Result;
// role.Claims.Add(new IdentityRoleClaim<string>() { ClaimType = "IsManager", ClaimValue = "True" });
}
ApplicationUser user = new ApplicationUser
{
UserName = "raj",
FirstName = "Raj",
LastName = "Narayanan",
Email = "raj@raj.com"
};
IdentityResult userResult = userMgr.CreateAsync(user, "Asp3raj#").Result;
IdentityResult roleResult = userMgr.AddToRoleAsync(user, "Manager").Result;
IdentityResult claimResult = userMgr.AddClaimAsync(user, new Claim("GreenBadge", "True")).Result;
if (!userResult.Succeeded || !roleResult.Succeeded || !claimResult.Succeeded)
{
throw new InvalidOperationException("Failed to build user and roles");
}
}
//user = userMgr.FindByNameAsync("Shawnw");
// Add User
if (userMgr.FindByNameAsync("Shawnw").Result == null)
{
if (!(roleMgr.RoleExistsAsync("Employee").Result))
{
IdentityRole role = new IdentityRole();
role.Name = "Employee";
IdentityResult result=roleMgr.CreateAsync(role).Result;
IdentityResult claim =roleMgr.AddClaimAsync(role, new Claim(type: "IsEmployee", value: "True")).Result;
// role.Claims.Add(new IdentityRoleClaim<string>() { ClaimType = "IsManager", ClaimValue = "True" });
}
ApplicationUser user = new ApplicationUser
{
UserName = "shawnw",
FirstName = "Shawn",
LastName = "Wildermuth",
Email = "shawnw@s.com"
};
IdentityResult userResult = userMgr.CreateAsync(user, "P@ssw0rd!").Result;
IdentityResult roleResult = userMgr.AddToRoleAsync(user, "Employee").Result;
IdentityResult claimResult = userMgr.AddClaimAsync(user, new Claim("OrangeBadge", "True")).Result;
if (!userResult.Succeeded || !roleResult.Succeeded || !claimResult.Succeeded)
{
throw new InvalidOperationException("Failed to build user and roles");
}
}
// user = userMgr.FindByNameAsync("John");
// Add User
if (userMgr.FindByNameAsync("John").Result == null)
{
if (!(roleMgr.RoleExistsAsync("Vendor").Result))
{
IdentityRole role = new IdentityRole();
role.Name = "Vendor";
IdentityResult result = roleMgr.CreateAsync(role).Result;
IdentityResult claim= roleMgr.AddClaimAsync(role, new Claim(type: "IsVendor", value: "True")).Result;
// role.Claims.Add(new IdentityRoleClaim<string>() { ClaimType = "IsManager", ClaimValue = "True" });
}
ApplicationUser user = new ApplicationUser
{
UserName = "johng",
FirstName = "John",
LastName = "Galli",
Email = "gali@gali.com"
};
IdentityResult userResult = userMgr.CreateAsync(user, "P@ssw0rd!").Result;
IdentityResult roleResult = userMgr.AddToRoleAsync(user, "Vendor").Result;
IdentityResult claimResult = userMgr.AddClaimAsync(user, new Claim("BlueBadge", "True")).Result;
if (!userResult.Succeeded || !roleResult.Succeeded || !claimResult.Succeeded)
{
throw new InvalidOperationException("Failed to build user and roles");
}
}
}
}
Startup.cs
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, UserManager<ApplicationUser> userMgr, RoleManager<IdentityRole> roleMgr)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
BlazeMartDbSeeder.Seed(userMgr, roleMgr);
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
注意:密码的组成部分包含大小写字母、数字和特殊符号。
关于ASP.NET Core Identity中的种子用户和角色数据,您可以参考here。