有没有办法在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。
答案 0 :(得分:0)
您可以使用Key-Many-To-One映射并从关系实体中删除Id字段。此外,您最好将继承用于不同的关系类型。
答案 1 :(得分:0)
我对此表示怀疑。如果您考虑手动SQL查询,则需要编写以提取用户&amp;他在外部联接查询中的所有关系,你可以看到为什么NHibernate会很难生成这样的东西。更新将是一个更大的问题 - 你如何决定哪个ID在哪个字段中用于新的关系?
如果您坚持使用此模型,我可以建议的解决方法是映射两个私有集合并实现Union()ed只读公共集合。实现定位和更新的更新/删除方法修改适当的关系,并使用循环法Add()方法。您不会对此集合上的查询提供任何NHibernate查询支持。
您的另一个选择是更改您的数据模型,以便User与Relation具有多对多关系(例如UserRelation表),依赖应用程序代码来强制执行“每个关系两个用户”规则,并增加便利性像IList<User> GetRelations(RelationType)