我在种子方法中创建了一些数据。我正在创建一些具有一些权限(角色)的用户
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>
我错过了什么吗?
答案 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);