NHibernate多对多映射更新关联表

时间:2015-10-23 03:07:43

标签: c# nhibernate fluent-nhibernate fluent-nhibernate-mapping

我正在尝试使用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个一对多映射来处理它。角色表。

感谢是否有人能够提供帮助:)自昨天晚上以来一直在努力。非常感谢你。

1 个答案:

答案 0 :(得分:0)

这是与反向设置有关的问题。解决方案非常简单 - 遵循良好做法

在这种情况下,设置关系的两侧 - 始终:

var role = RoleManager.Get(new Guid(itemRole.Value));
objUser.Roles.Add(role);
role.Users.Add(objUser);