NHibernate自加入多对多对称关系(人朋友问题)

时间:2009-11-29 04:15:33

标签: nhibernate nhibernate-mapping

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

Users
  id

Relations
  id
  user1
  user2
  relation_type

User和Relation类应如下所示:

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; }
}

我不希望relations表有两行用于相同的关系。但关系必须是对称的,这意味着如果两个用户A和B之间存在关系,则用户A的Relations集合必须包含与用户B的关系,并且用户B的关系必须包含与甲

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

2 个答案:

答案 0 :(得分:0)

您可以使用Key-Many-To-One映射并从关系实体中删除Id字段。此外,您最好将继承用于不同的关系类型。

答案 1 :(得分:0)

我对此表示怀疑。如果您考虑手动SQL查询,则需要编写以提取用户&amp;他在外部联接查询中的所有关系,你可以看到为什么NHibernate会很难生成这样的东西。更新将是一个更大的问题 - 你如何决定哪个ID在哪个字段中用于新的关系?

如果您坚持使用此模型,我可以建议的解决方法是映射两个私有集合并实现Union()ed只读公共集合。实现定位和更新的更新/删除方法修改适当的关系,并使用循环法Add()方法。您不会对此集合上的查询提供任何NHibernate查询支持。

您的另一个选择是更改您的数据模型,以便User与Relation具有多对多关系(例如UserRelation表),依赖应用程序代码来强制执行“每个关系两个用户”规则,并增加便利性像IList<User> GetRelations(RelationType)

这样的方法