整数 idsを使用した Identity 3.0 シードを使用すると、奇妙な結果が得られます。これを使用して、ロールをシードしています-2つだけです:
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 の例から得たものです。
役割は次のとおりで、説明と呼ばれる追加のフィールドがあります。
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();
データベースが存在しない場合、起動時に作成されます...問題ありません-動作します。
ロールを確認すると、2 番目のロールのみを取得するか、両方のロールを 2 回取得します。
メソッドのロールを確認しようとしましたが、ロールを追加する前にロールがあるかどうかも確認しました。
テーブルの内容を削除したので、すべての行を削除して再度実行すると、ID が「2」の 2 番目のロールしか取得できません... ID が 2 であることは問題ないようですが、なぜ 1 つのレコードだけなのでしょうか?
データベースを削除してプロジェクトを再実行したところ、ID が「1」の 2 番目のロールが作成されましたが、まだ 1 つのレコードしかありません。
私がメソッドを書いた方法かもしれないと考えて、ユニコーンの例に近づくようにメソッドを書き直しました..
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] });
}
}
}
}
}
最初に実行したときは完全に機能しました..データベースを削除して2回目に実行しました..2番目のレコードのみが保存されました..その後、データベースを再度削除して3回目に実行し、4つのレコードを取得しました..両方です二役??
私はこれを間違ってやっていますか?コードは 2 つのロールを作成するのに問題ないように見えますが、何か見落としているのでしょうか? 何か案は?