我正在使用seed方法创建一些数据。我正在创建一些具有一些权限的用户(角色)
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 = "[email protected]";
var userusername = "[email protected]";
我通过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。通过重复但添加第四个角色进行测试,似乎(用户名,角色)参数是错误的方法!新角色的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>
我想念什么吗?
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);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句