gpt4 book ai didi

c# - 多实体关系映射流利的 NHibernate

转载 作者:太空宇宙 更新时间:2023-11-03 10:54:53 25 4
gpt4 key购买 nike

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

ER diagram

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

class It{
A a;
B b;
C c;
}
class A{
public virtual ISet<It> Relationship{set;get;}
}

但是,我担心 NHibernate 可能会自行将 ID 添加到“It”,或者我可能必须使用复合键(这不是一个好的做法)。

两个:我找到了this .它在每个类上使用两个单独的集合来模拟三向关系。但我认为稍后访问信息会产生不必要的努力,而且正确映射也有点棘手。

相反,我认为我可以做类似的事情:

class A{
IList<Tuple<C, D>> ARelationship;
}

这样您就可以从一开始就将这两个引用放在一起。但是我还没有找到关于如何进行这种映射的示例(元组列表)。我发现你可以定义一个 ICompositeUserType子类来做到这一点,但是我不完全理解它是如何工作的或如何使用它来解决我的问题。

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

最佳答案

NHibernate 中的三向关联

在 NHibernate 中有两种主要的映射三元(又名三向)关联的方法。

  1. map使用 index-many-to-many (又名 map-key-many-to-many ),以及
  2. 收集composite-element内容。


map使用 index-many-to-many

来自documentation :

There are two possible approaches to mapping a ternary association. One approach is to use composite elements (discussed below). Another is to use an IDictionary with an association as its index:

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

如果可能,我喜欢使用 IDictionary方法如上图。当关联表中的两个引用存在某种唯一约束时,这种方法非常适合,如下所示:

create table It (
A_id int not null,
B_id int not null,
C_id int not null,
primary key (A_id, B_id),
foreign key (A_id) references A (Id),
foreign key (B_id) references B (Id),
foreign key (C_id) references C (Id)
);

这允许您创建如下所示的对象模型:

public class A
{
public virtual IDictionary<B, C> RelatedCEntities { get; set; }
}

这个映射看起来像:

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

您永远不必映射 It作为一个实体。它只是用作 many-to-many 的关联表。 .


集合composite-element

如果没有唯一约束,我们可以看a little lower in the documentation对于复合元素:

Collections of components are supported (eg. an array of type Name). Declare your component collection by replacing the <element> tag with a <composite-element> tag.

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

Note: if you define an ISet of composite elements, it is very important to implement Equals() and GetHashCode() correctly.

...

Even ternary (or quaternary, etc) associations are possible:

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

我认为您无法使用 Tuple<T1, T2>因为它是不可变的 - 属性 Item1Item2没有二传手。但是为此目的创建一个具有两个属性的小类是微不足道的。

关于c# - 多实体关系映射流利的 NHibernate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19914009/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com