0

整数 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 つのロールを作成するのに問題ないように見えますが、何か見落としているのでしょうか? 何か案は?

4

1 に答える 1

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] });
                    }
                }
            }
于 2016-04-30T23:57:05.107 に答える