我正在尝试使用NHibernate 4和Fluent Nhibernate 2设置多对多映射。这是一个简单的用户和角色关系。一个用户可能有多个角色,一个角色可能有很多用户。以下是结构。
用户
public User()
{
Id = Guid.NewGuid();
Roles = new List<Role>();
}
public virtual Guid Id { get; set; }
public virtual string Name { get; set; }
public virtual IList<Role> Roles { get; set; }
作用
public Role()
{
Id = Guid.NewGuid();
Users = new List<User>();
}
public virtual Guid Id { get; set; }
public virtual string Name { get; set; }
public virtual IList<User> Users { get; set; }
用户映射
Id(x => x.Id).Column("Id").GeneratedBy.Assigned();
Map(x => x.Name);
HasManyToMany(x => x.Roles)
.Cascade.AllDeleteOrphan()
.Inverse()
.Table("UserRole")
.ParentKeyColumn("ObjUser")
.ChildKeyColumn("ObjRole");
RoleMap
Id(x => x.Id).Column("Id").GeneratedBy.Assigned();
Map(x => x.Name);
HasManyToMany(x => x.Users)
.Cascade.None()
.Table("UserRole")
.ParentKeyColumn("ObjRole")
.ChildKeyColumn("ObjUser");
更新现有用户
User objUser = UserManager.Get(_userId);
objUser.Name = txtName.Text;
foreach (ListItem itemRole in chksRoles.Items)
{
if (itemRole.Selected)
{
objUser.Roles.Add(RoleManager.Get(new Guid(itemRole.Value)));
}
}
我有一个UserRole表用于关联,它只包含ObjRole和ObjUser列。我在下面遇到的问题。
1)当我创建新用户并为其设置多个角色时,我能够插入新记录。但是当我尝试通过更改现有用户的角色来更新现有用户时,实际上并没有更新关联,也没有发生任何事情。对用户的角色仍然是相同的。
2)如果我在创建新角色时不想创建新用户,如何设置级联?原因是当我创建一个新角色时,将不会有这个角色的用户。
我试图使用hasmanytomany映射来解决这个问题,因为我没有在UserRole表中存储任何其他字段,所以我认为没有必要在用户和用户中使用2个一对多映射来处理它。角色表。
感谢是否有人能够提供帮助:)自昨天晚上以来一直在努力。非常感谢你。
答案 0 :(得分:0)
这是与反向设置有关的问题。解决方案非常简单 - 遵循良好做法。
在这种情况下,设置关系的两侧 - 始终:
var role = RoleManager.Get(new Guid(itemRole.Value));
objUser.Roles.Add(role);
role.Users.Add(objUser);