所以,就在上周,我问了一个关于如何处理many-to-many with extra columns nhibernate的问题。答案似乎很清楚,只需使用链接表并制作两个多对一。然而,由于我使用Entity Developer生成我的模型,我遇到了该方法的问题... < / p>
无论如何,我继续调查多对多问题,发现也许我可以创建某种复合元素,这种复合元素很像多对多,但有一个额外的属性(!)
这将是新模型:
User的映射文件如下所示:
<hibernate-mapping ...>
<class name="User" table="Users">
<id name="UId" type="Int32">...</id>
<property name="UserName" type="String">...</property>
<set name="Groups" table="UGLinks" inverse="true" generic="true">
<key>
<column name="UId" />
</key>
<composite-element class="UGLinkExtra">
<many-to-one name="Groups" class="Group" fetch="join">
<column name="GId" />
</many-to-one>
<property name="Date">
<column name="Date" not-null="true" />
</property>
</composite-element>
</set>
</class>
</hibernate-mapping>
所以我有Composite-element
这种模拟多对多外观但具有额外的列属性。
假设我想要链接User u
和Group g
。
u.Groups.add(new UGLinkExtra() {Groups = g, Date = DateTime.Now});
在NHibernate中我也看到添加了一个链接(如果我做了u.Groups我得到一个列表(UGLinkExtra),其中包含g),但是我无法将其保存到数据库中!
即使我做session.SaveOrUpdate(u)
(或者我已尝试过两者),它也永远不会被写入数据库......只有我看到的SQL是:
NHibernate: SELECT this_.UId as UId0_0_, this_.UserName as UserName0_0_ FROM Users this_
NHibernate: SELECT this_.GId as GId2_0_, this_.GroupName as GroupName2_0_ FROM Groups this_
答案 0 :(得分:2)
此处的问题与<set>
的设置有关。你告诉NHiberante <set name="Groups" ... inverse="true"
这意味着:NHibernate,不要坚持这个集合的项目。这些都很聪明,他们会坚持下去......
如果我们使用<one-to-many>
映射,那通常都是正确的。但<composite-element>
完全依赖于其父集合......来管理其写操作。因此,将映射更改为 inverse="false"
<set name="Groups" table="UGLinks" inverse="false" ...