NHibernate:实现多人关系

NHibernate:实现多人关系,nhibernate,fluent-nhibernate,many-to-many,Nhibernate,Fluent Nhibernate,Many To Many,我有两张有很多关系的桌子 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

我有两张有很多关系的桌子

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; }
}
公共类用户
{
公共虚拟Guid Id{get;set;}
公共虚拟UInt64用户标识{get;set;}
公共虚拟IList组{get;set;}
}
公共课组
{
公共虚拟Guid Id{get;set;}
公共虚拟Guid组Guid{get;set;}
公共虚拟IList用户{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())
.Override(obj=>obj.hasmanytomy(x=>x.Groups).Table(“UserToGroup”).Cascade.AllDeleteOrphan()
.Override(obj=>obj.hasmanytomy(x=>x.Users).Table(“UserToGroup”).Cascade.AllDeleteOrphan().Inverse())
当我添加包含组列表的用户时,所有表都已更新确定: 在用户表中插入新用户。好啊 在组表中插入新组。好啊 插入新关系inUserToGroup表。嗯

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

public void AddUser(用户userData,IList-groupid)
{
用户=新用户();
user.UserId=userData.UserId;

IList Users=new List出现这种情况的原因是,当您将未关联的组实体与用户对象关联时,您可能正在使用这些实体。因此,您需要从数据库中加载它们

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

要回答第二个问题,您应该能够设置关系的一侧。但是,我不明白为什么要为关系设置两个单独的表。您通常只需要另外一个表:

User
Group
UserGroup

您可以显示为用户填充组的代码吗?@MartinErnst您可以在“我使用以下代码添加用户(包括组)”之后的代码中看到组填充:1.如果说我需要从DB加载,您的意思是我应该从您的会话中加载。加载到我要添加到用户的所有groupId?如果groupId属性不是我的表id,怎么做?关于切换到使用GroupGuid作为我的id,我不能使用它,因为它的值不是由Hibernate设置的,而是由应用程序获取的(我无法使用此属性的Hibernate生成)。关于上一节:我仅使用一个表来表示两个实体之间的关系。UserGroup是用户和Grroup1之间的关系表。我不明白如何从数据库中加载组实体?(使用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作为生成器类型,并依靠你的应用程序来分配ID。谢谢你的帮助答案。它通过在构造函数中将组实体的Id设置为GroupGuid值来工作。并通过设置要生成的Id.assign(现在我有两列具有相同的值)。我无法将GroupGuid设置为实体Id,因为它是组实体组件中的属性。您知道是否可以在自动映射中设置实体组件中属性的Id?
User
Group
UserGroup