【问题标题】:NHibernate: Implementing ManyToMany RelationshipNHibernate:实现多对多关系
【发布时间】:2012-06-05 15:52:45
【问题描述】:

我有 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())

当我添加一个包含组列表的用户时,所有表都更新了: 在用户表中插入新用户。好的 在组表中插入新组。好的 在 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);
}

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

问题:

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

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

谢谢, 海蒙。

【问题讨论】:

  • 您能否显示为用户填充组的代码?
  • @MartinErnst 您可以在“我使用以下代码添加用户(包括组):”之后的代码中看到组人口:

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


【解决方案1】:

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

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

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

User
Group
UserGroup

【讨论】:

  • 1.通过说我需要从 DB 加载,你的意思是我应该将 Session.Load 加载到我想添加到用户的所有 groupId 中?如果 groupId 属性不是我的表 id 怎么办?关于切换到使用 GroupGuid 作为我的 id,我不能使用它,因为它的值不是由 Hibernate 设置的,但我是由应用程序获取的(我不能使用 Hibernate 生成此属性)。关于你的最后一部分:我只使用一个表来表示 2 个实体之间的关系。 UserGroup 是 User 和 Group 的关系表
  • 1.我不明白如何从数据库中加载组实体? (使用 Session.Load/QueryOver?) 2. 关于使用 Guid - 目前我使用 Guid Id(即 Id 和 PK,由 hibernate 生成),并且我还有一个名为:GroupGuid 的 Guid 属性,我通过应用程序获得(不是 PK 不是 Id 并且不是由 Hibernate 生成而是由应用程序提供的)。切换到 Guid 是什么意思 - 我已经使用 Guid (GroupGuid)。如果您的意思是我的 shell 只使用 GroupGuid 并且它应该是表 ID 和 PK - 我怎么能不让 Hibernate 为我生成它?
  • @Haimon 1. 是的,您可以将它们与 Session.Load 或某种查询一起使用。 2.您可以使用assigned作为生成器类型nhforge.org/doc/nh/en/…,并依靠您的应用程序来分配id。
  • 感谢您的回答。它通过在构造函数中将 Group 实体的 Id 设置为 GroupGuid 值来工作。并通过将 Id 设置为 generate.assign (现在我有 2 列具有相同的值)。我无法将 GroupGuid 设置为实体 ID,因为它是 Group Entity 中组件中的属性。您知道是否可以在 AutoMap 中设置实体组件中的属性的 Id 吗?
猜你喜欢
  • 2011-03-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-29
相关资源
最近更新 更多