使用带有整数ID 的Identity 3.0种子,我得到了奇怪的结果。我正在播种角色 - 只有两个 - 使用它:
using JobsLedger.DAL;
using JobsLedger.Models.Identity;
using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Identity;
using Microsoft.Extensions.DependencyInjection;
using System.Collections.Generic;
using System.Linq;
namespace JobsLedger.Models.Seeding
{
public static class SeedRoles
{
public static void EnsureRolesCreated(this IApplicationBuilder app)
{
var _context = app.ApplicationServices.GetService<JobsDbContext>();
if (_context.AllMigrationsApplied())
{
if (!_context.Roles.Any())
{
var roleManager = app.ApplicationServices.GetService<RoleManager<Role>>();
var Roles = new List<Role>();
Roles.Add(new Role { Name = "Admin", Description = "Users able to access all areas" });
Roles.Add(new Role { Name = "Technician", Description = "Users able to access just the schedule" });
foreach (var role in Roles)
{
if (!roleManager.RoleExistsAsync(role.Name).Result)
{
roleManager.CreateAsync(role);
}
}
_context.SaveChanges();
}
}
}
}
}
我从github上的Unicorn example得到的。
使用名为Description:
的额外字段,角色如下所示public class Role : IdentityRole<int>
{
public Role() : base() { }
public Role(string name) { Name = name; }
public string Description { get; set; }
}
在我的启动中,我在configure()方法中有这个:
app.EnsureRolesCreated();
我已将项目配置为使用以下命令通过Startup.cs重新创建数据库:
serviceScope.ServiceProvider.GetService<JobsDbContext>().Database.Migrate();
数据库在启动时创建,如果它不在那里......很好 - 它可以工作。
现在,当我检查角色时,我要么只获得第二个角色,要么两个角色两次.. 4个记录..或者,很少只是两个记录,这是它的假设。
我尝试检查方法中的角色,并在添加角色之前检查是否有任何角色。
我删除了表的内容,所以所有行再次运行它,我只得到第二个角色,ID为&#34; 2&#34; ...好像它的id是2但是为什么只是一个记录?
删除了数据库并重新运行了项目,现在它的第二个角色的ID为&#34; 1&#34; ...但仍只是一条记录。
重写方法更接近Unicorn example,认为这可能是我编写方法的方式..
public static void EnsureRolesCreated(this IApplicationBuilder app)
{
var _context = app.ApplicationServices.GetService<JobsDbContext>();
if (_context.AllMigrationsApplied())
{
if (!_context.Roles.Any())
{
var roleManager = app.ApplicationServices.GetService<RoleManager<Role>>();
var Roles = new string[,]
{
{"Admin","Users able to access all areas" },
{"Technician","Users able to access just the schedule" }
};
for (int i = 0; i < Roles.GetLength(0); i++)
{
if (!roleManager.RoleExistsAsync(Roles[i, 0].ToUpper()).Result)
{
roleManager.CreateAsync(new Role { Name = Roles[i, 0], Description = Roles[i, 1] });
}
}
}
}
}
第一次运行它时效果很好..删除了数据库并再次运行它。仅保存了第二条记录..然后我再次删除了数据库并第三次运行并获得了4条记录。那两个角色都是两次?
我做错了吗?代码似乎可以创建两个角色,但也许我错过了什么?有什么想法吗?
答案 0 :(得分:0)
好的,所以我相信我已经解决了这个问题,最后这很简单。我将静态方法转换为异步静态方法,现在它似乎每次都完美地运行:
public static async void EnsureRolesCreatedAsync(this IApplicationBuilder app)
{
var _context = app.ApplicationServices.GetService<JobsDbContext>();
if (_context.AllMigrationsApplied())
{
if (!_context.Roles.Any())
{
var roleManager = app.ApplicationServices.GetService<RoleManager<Role>>();
var Roles = new string[,]
{
{"Admin","Users able to access all areas" },
{"Technician","Users able to access just the schedule" }
};
for (int i = 0; i < Roles.GetLength(0); i++)
{
if (!roleManager.RoleExistsAsync(Roles[i, 0].ToUpper()).Result)
{
Debug.Write("add role");
await roleManager.CreateAsync(new Role { Name = Roles[i, 0], Description = Roles[i, 1] });
}
}
}