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>