NHibernate自连接多对多对称关系(个人朋友问题)

NHibernate自连接多对多对称关系(个人朋友问题),nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,有没有办法在NHibernate中建立对称的自连接关系映射?假设我们有两张桌子: Users id Relations id user1 user2 relation_type 用户和关系类应如下所示: class User { public virtual int Id { get; set; } public virtual string Name { get; set; } public virtual ISet<Relation>

有没有办法在NHibernate中建立对称的自连接关系映射?假设我们有两张桌子:

Users
  id

Relations
  id
  user1
  user2
  relation_type
用户和关系类应如下所示:

class User
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual ISet<Relation> Relations { get; set; }
}

class Relation
{
    public virtual int Id { get; set; }
    public virtual User User1 { get; set; }
    public virtual User User2 { get; set; }
    // Let's leave the RealationType as string for the sake of brevity 
    public virtual string RelationType { get; set; }
}
我不希望关系表中的同一关系有两行。但是关系必须是对称的,这意味着如果两个用户a和B之间存在关系,那么用户a的关系集合必须包含与用户B的关系,用户B的关系必须包含与a的关系


这听起来像是一个挑战。但是,有人能解决这个问题吗?如果可以,请发布xml映射。我没有使用Fluent。

您可以使用键多对一映射,并从关系实体中删除Id字段。另外,您最好对不同的关系类型使用继承

可以使用键多对一映射,并从关系实体中删除Id字段。另外,您最好对不同的关系类型使用继承

我对此表示怀疑。如果您考虑需要编写手动SQL查询来在外部连接查询中提取用户的所有关系,那么您就可以了解为什么NHibernate很难生成这样的内容。更新将是一个更大的头痛问题-如何决定新关系的哪个ID位于哪个字段

如果您仍停留在这个模型上,我所能建议的解决方法就是映射两个私有集合,并实现一个联合只读公共集合。实现查找和修改适当关系的更新/删除方法,以及循环添加方法。对于此集合上的查询,您将没有任何NHibernate查询支持


您的另一个选择是更改您的数据模型,以便用户对关系具有多对多关系,例如UserRelation表,依靠应用程序代码强制执行“每个关系两个用户”规则,并添加诸如IList GetRelationsRelationType之类的方便方法,我对此表示怀疑。如果您考虑需要编写手动SQL查询来在外部连接查询中提取用户的所有关系,那么您就可以了解为什么NHibernate很难生成这样的内容。更新将是一个更大的头痛问题-如何决定新关系的哪个ID位于哪个字段

如果您仍停留在这个模型上,我所能建议的解决方法就是映射两个私有集合,并实现一个联合只读公共集合。实现查找和修改适当关系的更新/删除方法,以及循环添加方法。对于此集合上的查询,您将没有任何NHibernate查询支持


您的另一个选择是更改数据模型,以便用户对关系具有多对多关系,例如UserRelation表,依靠应用程序代码强制执行“每个关系两个用户”规则,并添加方便的方法,如IList GetRelationsRelationType

Ok,关系的映射是这样的。。。我应该如何映射用户类?因为id可以在user1列或user2列上。好的,所以关系的映射应该是这样的。。。我应该如何映射用户类?因为id可以在user1列或user2列上。