NHibernate:实现ManyToMany关系

时间:2012-05-31 11:34:28

标签: nhibernate fluent-nhibernate many-to-many

我有2个表与manyToMany关系。

public class User
{
   public virtual Guid Id { get; set; }
   public virtual UInt64 UserId { get; set; }
   public virtual IList<Group> Groups{ get; set; }
}

public class Group
{
   public virtual Guid Id { get; set; }
   public virtual Guid GroupGuid  { get; set; }
   public virtual IList<User> Users{ get; set; }
}

我使用Fluent NHibernate自动映射它们如下:

.Override<User>(obj => obj.HasManyToMany(x => x.Groups).Table("UserToGroup").Cascade.AllDeleteOrphan())

.Override<Group>(obj => obj.HasManyToMany(x => x.Users).Table("UserToGroup").Cascade.AllDeleteOrphan().Inverse())

当我添加包含组列表的用户时,所有表都更新了OK: 在User表中插入新用户。好 在组表中插入新组。好 在userToGroup表中插入新关系。行

我使用以下代码添加用户(包括组):

public void AddUser(User userData, IList<Guid> groupIds)
{
   User user = new User();
   user.UserId = userData.UserId;

   IList<User> Users = new List<Users();
   Users.Add(user);

   IList<Group> groups = new List<Group>();

   foreach (Guid groupId in groupIds)
   {
      Group grp = new Group();
      grp.GroupGuid = groupId;
      grp.Users = Users;
      groups.Add(grp);
   }

   user.Groups = groups;
   Session.Save(user);
}

问题: 当我添加包含GroupGuid已存在于Group表中的新用户时,会将新记录插入到具有相同GroupGuid和新ID的Group表中。

问题:

  1. 如何让NHibernate仅向Group表添加新的GroupGuid ID?并且仍然在UserToGroup表中添加一个关系,该关系将新用户与现有组相关联。

  2. 在AddUser方法中 - 我应该设置实体的两边,即设置user.Groups with group list并设置group.Users with user list?

  3. 谢谢, Haimon。

1 个答案:

答案 0 :(得分:2)

您遇到此问题的原因是,当您将它们与User对象关联时,您可能正在使用未关联的Group实体。所以你需要从数据库加载它们。

或者,您可以切换为使用Guids作为实体的ID,而不是您设置的其他主键。

要回答你的第二个问题,你应该能够设定关系的一面。但是,我很困惑为什么你会有两个单独的关系表。您通常只需要另外一个表:

User
Group
UserGroup