Roles.AddUserToRole使用相同的用户名查找不同的userId

时间:2013-10-11 20:41:03

标签: ef-code-first roleprovider

我在种子方法中创建了一些数据。我正在创建一些具有一些权限(角色)的用户

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 Pattern

创建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);

last roles命令导致错误,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>

我错过了什么吗?

1 个答案:

答案 0 :(得分: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);