NHibernate:实现多对多关系

标签 nhibernate fluent-nhibernate many-to-many

我有 2 个具有多对多关系的表。

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: 在用户表中插入新用户。好的 在组表中插入新组。好的 在 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 的新用户时,该 GroupGuid 已存在于 Group 表中,新记录将插入到具有相同 GroupGuid 和新 ID 的 Group 表中。

问题:

  1. 如何让 NHibernate 只添加新的 GroupGuid id 到组表?并仍然在 UserToGroup 表中添加一个关系,将新用户与现有组相关联。

  2. 在 AddUser 方法中 - 我应该用实体设置双方,即用组列表设置 user.Groups 并用用户列表设置 group.Users 吗?

谢谢, 海蒙。

最佳答案

您遇到这种情况的原因是,当您将它们与您的用户对象相关联时,您可能会使用未关联的组实体。所以你需要从数据库中加载它们。

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

要回答您的第二个问题,您应该只能设置关系的一侧。但是,我很困惑为什么你会有 2 个单独的关系表。您通常只需要 1 个其他表:

User
Group
UserGroup

关于NHibernate:实现多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10832776/

相关文章:

nhibernate - Fluent NHibernate——使用复合键保存实体

java - Hibernate、JPA - 具有两个表的多对多示例

java - Spring JPA 多对多,额外列未更新

python - 如何在不使用 for 循环的情况下在多对多字段上应用过滤器

.net - 需要有关大型 .net 数据访问层的建议

nhibernate - 在 Fluent NHibernate 中将 1 映射到 0..1

c# - HasMany 给出 null child

.net - 从 NHibernate 生成数据库模式脚本

fluent-nhibernate - 在 Fluent NHibernate 中使用鉴别器

c# - 如何在流利的 nhibernate 中为引用添加条件?