1

シード メソッドでいくつかのデータを作成しています。いくつかの権限 (役割) を持つ少数のユーザーを作成しています

WebSecurity.InitializeDatabaseConnection("MibContext", "UserProfile", "UserId", "UserName", autoCreateTables: true);
Roles.CreateRole(Constants.Roles.Administrator);
Roles.CreateRole(Constants.Roles.ContentManager);
Roles.CreateRole(Constants.Roles.KeyAccountManager);

次に、ユーザー名の変数を用意します(タイプミスの可能性を避けるため)

var adminusername = "admin@domain.com";
var userusername = "user@domain.com";

EF と UnitOfWork パターンを使用して Userprofile レコードを作成します

var admin = new UserProfile
        {
            FirstName = "Admin",
            LastName = "Account",
            UserName = adminusername
        };
unitOfWork.UserRepository.Insert(admin);
unitOfWork.Save();

次に、ユーザー メンバーシップ アカウントを作成し、役割を割り当てます。

WebSecurity.CreateAccount(adminusername, "123456");
WebSecurity.CreateAccount(userusername, "123456");

Roles.AddUserToRole(userusername, Constants.Roles.Administrator);
Roles.AddUserToRole(userusername, Constants.Roles.KeyAccountManager);

最後のロール コマンドにより、エラー、UsersInRoles と UserProfile 間の外部キー違反が発生します。ロールを最初のユーザーにマップできるため、これは非常に奇妙です (最初は管理者ユーザーでしたが、そのユーザーのアクセス許可を作成できるかどうかを確認したかったので、実際に実行しました)。

次に、何が起こっているのかを確認するために外部キー制約を削除し、そこに 3 を入れました。4 番目の役割を繰り返し追加してテストすると、(ユーザー名、役割) パラメーターが間違っているようです!?!? 新しいロールには Id=4 があり、テストを繰り返すと、それが UserId 列に入力されます。

RoleId  UserId
2        1
2        4
NULL     NULL

役割が構成されています。

<roleManager enabled="true" defaultProvider="SimpleRoleProvider">
  <providers>
    <clear/>
    <add name="SimpleRoleProvider" 
         type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData" />
  </providers>
</roleManager>

何か不足していますか?

4

1 に答える 1

1

webpages_UsersInRole テーブルのフィールドの順序は明らかに非常に重要です。

そこにあるものを確認するためにマッピングを調べたところ、関係 (多 -> 多) が ROLES テーブル側で定義されていました。マッピングをユーザー側にスワップしたところ、正しく機能するようになりました。UserProfile オブジェクトで使用したマッピングを次に示します。

 // Relationships
        this.HasMany(t => t.webpages_Roles)
            .WithMany(t => t.UserProfiles)
            .Map(m =>
            {
                m.ToTable("webpages_UsersInRoles");
                m.MapRightKey("RoleId");
                m.MapLeftKey("UserId");
            });

実際には、ロール プロバイダーは列の順序を想定してはならず、列の名前を指定する必要があります。少なくとも、このようにマッピングを修正することで、デフォルトの機能を引き続き使用できます。これはかなり貧弱な SQL です:

INSERT INTO webpages_UsersInRoles VALUES (4,1); 
于 2013-10-21T17:44:01.510 に答える