C# 多实体关系映射

C# 多实体关系映射,c#,nhibernate,fluent-nhibernate,fluent-nhibernate-mapping,C#,Nhibernate,Fluent Nhibernate,Fluent Nhibernate Mapping,这是我的实体关系模型的一部分: 我找到了几种映射“It”关系的方法: :添加新类,然后使用多对多关系引用它: class It{ A a; B b; C c; } class A{ public virtual ISet<It> Relationship{set;get;} } 给它分类{ A A; B B; C C; } 甲级{ 公共虚拟ISet关系{set;get;} } 然而,我担心NHibernate可能会自己为“It”添加一个ID,或者我可能不得不使用

这是我的实体关系模型的一部分:


我找到了几种映射“It”关系的方法:
:添加新类,然后使用多对多关系引用它:

class It{
  A a;
  B b;
  C c;
}
class A{
  public virtual ISet<It> Relationship{set;get;}
}
给它分类{
A A;
B B;
C C;
}
甲级{
公共虚拟ISet关系{set;get;}
}
然而,我担心NHibernate可能会自己为“It”添加一个ID,或者我可能不得不使用复合键(这不是一个好的做法)

两个:我找到了。它在每个类上使用两个单独的集合来建模三方关系。但是我认为以后访问这些信息会有不必要的努力,而且要正确地获取映射会有点困难

相反,我想我可以做一些事情,比如:

class A{
  IList<Tuple<C, D>> ARelationship;
}
A类{
国际关系;
}
这样,从一开始就可以将这两个参考资料放在一起。但是我还没有找到一个关于如何进行这种映射的示例(元组列表)。我发现您可以定义一个子类来实现这一点,但是我不完全理解它是如何工作的,或者如何使用它来解决我的问题

我的问题是:建立这种关系的最佳方式是什么
如果是使用单独的类(方法一),那么从每个类的角度映射它的最佳方法是什么,以及如何映射新定义的类
如果是通过使用元组列表,是否可以在不使用ICompositeUserType的情况下映射它?怎么做
另外,我可能因为做了不正确的谷歌搜索而错过了答案。还有其他选择吗?

NHibernate中的三方关联 在NHibernate中映射三元(也称为三元)关联的方法主要有两种

  • 映射
    使用
    索引多对多
    (又称
    映射键多对多
    ),以及
  • 包含
    复合元素
    内容的集合

  • 映射
    使用
    索引多对多
    从:

    映射三元关联有两种可能的方法。一种方法是使用复合元素(如下所述)。另一种方法是使用关联作为索引的
    IDictionary

    <map name="Contracts" lazy="true">
        <key column="employer_id"/>
        <index-many-to-many column="employee_id" class="Employee"/>
        <one-to-many class="Contract"/>
    </map>
    
    <map name="Connections" lazy="true">
        <key column="node1_id"/>
        <index-many-to-many column="node2_id" class="Node"/>
        <many-to-many column="connection_id" class="Connection"/>
    </map>
    
    这允许您创建如下所示的对象模型:

    public class A
    {
        public virtual IDictionary<B, C> RelatedCEntities { get; set; }
    }
    
    注意:如果您定义复合元素的
    ISet
    ,正确实现
    Equals()
    GetHashCode()
    是非常重要的

    甚至三元(或四元等)关联也是可能的:

    <class name="Order" .... >
        ....
        <set name="PurchasedItems" table="purchase_items" lazy="true">
            <key column="order_id">
            <composite-element class="OrderLine">
                <many-to-one name="PurchaseDetails class="Purchase"/>
                <many-to-one name="Item" class="Item"/>
            </composite-element>
        </set>
    </class>
    
    
    ....
    
    字典方法对我不起作用:
    [Id\u A,Id\u B,Id\u C][1,1,1][1,1,2][1,2,2]
    'A'正在存储字典,B和C不是字典关键候选项。ISet最好地模拟了需求:没有重复的行,但是B可以随着C的变化而重复,或者C可以随着B的变化而重复。
    <map name="RelatedCEntities" table="It">
        <key column="A_id"/>
        <index-many-to-many column="B_id" class="B"/>
        <many-to-many column="C_id" class="C"/>
    </map>
    
    <set name="SomeNames" table="some_names" lazy="true">
        <key column="id"/>
        <composite-element class="Eg.Name, Eg"> <!-- class attribute required -->
            <property name="Initial"/>
            <property name="First"/>
            <property name="Last"/>
        </composite-element>
    </set>
    
    <class name="Order" .... >
        ....
        <set name="PurchasedItems" table="purchase_items" lazy="true">
            <key column="order_id">
            <composite-element class="OrderLine">
                <many-to-one name="PurchaseDetails class="Purchase"/>
                <many-to-one name="Item" class="Item"/>
            </composite-element>
        </set>
    </class>