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();

然后创建用户 Membership 帐户,并分配角色:

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

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

最后一个角色命令导致错误,UsersInRoles 和 UserProfile 之间的外键冲突。这很奇怪,因为它可以将角色映射到第一个用户(第一次是管理员用户,但想看看它是否可以为该用户创建权限,确实如此)

然后我删除了外键约束以查看发生了什么,并将 3 放在那里。通过重复但添加第四个角色进行测试,似乎(用户名,角色)参数是错误的!?!?新角色的 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

pages_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 回答