为什么我的ASP.NET Core的种子数据方法只有在管理员账户不存在时才会添加数据?
我在ASP.NET Core应用中使用Entity Framework Core和 Identity注入角色、一个管理员账户,以及一些起始记录。我的示例产品、时间窗口和奖励数据只有在管理员账户不存在时才会被添加。
public static class SeedMethod
{
public static async Task InitializeAsync(IServiceProvider serviceProvider)
{
var context = serviceProvider.GetRequiredService<ApplicationDbContext>();
var roleManager = serviceProvider.GetRequiredService<RoleManager<UserRole>>();
var userManager = serviceProvider.GetRequiredService<UserManager<UserRole>>();
await context.Database.MigrateAsync();
if (!await roleManager.RoleExistsAsync(""))
{
await roleManager.CreateAsync(new IdentityRole(""));
}
var adminEmail = "[email protected]";
var adminPassword = "Admin1!";
var adminUser = await userManager.FindByEmailAsync();
if (adminUser == null)
{
adminUser = new IdentityUser
{
UserName = ,
Email = ,
EmailConfirmed = true
};
var result = await userManager.CreateAsync(adminUser, adminPassword);
if (result.Succeeded)
{
await userManager.AddToRoleAsync(adminUser, "Admin");
}
}
else
{
if (!await userManager.IsInRoleAsync(adminUser, "Admin"))
{
await userManager.AddToRoleAsync(adminUser, "Admin");
}
}
}
}
为什么只有在管理员账户不存在时,我的起始数据才会被添加?
解决方案
你把示例数据绑定到了管理员账户的存在上。你的代码写着:如果没有管理员账户,就创建一个,然后(隐式地)对其余数据进行种子填充。管理员创建后,这个整个if块在将来的每次运行中都会被跳过。你需要分别使用它们各自的上下文来独立检查产品和奖励:
public static async Task InitializeAsync(IServiceProvider serviceProvider)
{
var context = serviceProvider.GetRequiredService<ApplicationDbContext>();
var userManager = serviceProvider.GetRequiredService<UserManager<IdentityUser>>();
await context.Database.MigrateAsync();
// Admin logic - keep this separate
var adminUser = await userManager.FindByEmailAsync("[email protected]");
if (adminUser == null)
{
// create admin logic
}
// Products logic - must be outside the admin check
if (!context.Products.Any())
{
context.Products.AddRange(new List<Product>
{
new Product { Name = "Sample", Price = 10 }
});
}
// Rewards logic - also independent
if (!context.Rewards.Any())
{
// seed rewards
}
await context.SaveChangesAsync();
}
Entity Framework Core并未报错,你的条件逻辑把管理员账户作为整个流程的门槛。通过对每张数据表分别使用 .Any() 进行检查,这个方法具备幂等性,无论 Identity 表中谁存在,都会补齐缺失的数据。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。