在 Nhibernate 中映射两个相同类型的双向集合
Mapping two bidirectional collections of the same type in Nhibernate
我有这样的模型
public class Scene
{
public virtual ICollection<Ray> Rays1 {get; set;}
public virtual ICollection<Ray> Rays2 {get; set;}
}
public class Ray
{
public virtual Scene Parent {get; set;}
}
如果我保持这种方式并将其映射到 2 个一对多关系,就会发生这种情况:
- 创建场景
- 在 Rays1 上添加 3 个项目
- 在 Rays2 上添加 2 个项目
- 提交到数据库
- 从数据库查询场景
现在 Rays1 和 Rays2 都有 5 个元素,因为它们共享相同的父 id
我能想到的唯一解决方案是从 Ray 继承 2 个新的 类,然后将它们中的每一个映射为一对多关系。这将在数据库上创建两个单独的表,但它们将具有完全相同的列。我就是觉得不对...
还有其他解决方案吗?
--编辑--
作为参考,这是我的映射文件:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="PanoMeasurer.Core.Domain"
namespace="PanoMeasurer.Core.Domain">
<class name="Panorama">
<id name="OID" generator="guid.comb"/>
<property name="HeadingBase"/>
<set name="Rays1" cascade="all-delete-orphan">
<key column="PanoramaId" />
<one-to-many class="Ray"/>
</set>
<set name="Rays2" cascade="all-delete-orphan">
<key column="PanoramaId" />
<one-to-many class="Ray"/>
</set>
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="PanoMeasurer.Core.Domain"
namespace="PanoMeasurer.Core.Domain">
<class name="Ray">
<id name="OID" generator="guid.comb"/>
<property name="Heading"/>
<property name="Elevation"/>
<many-to-one name="Owner" class="Panorama" column="PanoramaId" />
</class>
</hibernate-mapping>
如果您选择使用单个贴图,那么您可以将光线 1 和光线 2 作为光线列表中的过滤器。
public 虚拟 ICollection Rays1 { return Rays.Where()};
我有这样的模型
public class Scene
{
public virtual ICollection<Ray> Rays1 {get; set;}
public virtual ICollection<Ray> Rays2 {get; set;}
}
public class Ray
{
public virtual Scene Parent {get; set;}
}
如果我保持这种方式并将其映射到 2 个一对多关系,就会发生这种情况:
- 创建场景
- 在 Rays1 上添加 3 个项目
- 在 Rays2 上添加 2 个项目
- 提交到数据库
- 从数据库查询场景
现在 Rays1 和 Rays2 都有 5 个元素,因为它们共享相同的父 id
我能想到的唯一解决方案是从 Ray 继承 2 个新的 类,然后将它们中的每一个映射为一对多关系。这将在数据库上创建两个单独的表,但它们将具有完全相同的列。我就是觉得不对...
还有其他解决方案吗?
--编辑--
作为参考,这是我的映射文件:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="PanoMeasurer.Core.Domain"
namespace="PanoMeasurer.Core.Domain">
<class name="Panorama">
<id name="OID" generator="guid.comb"/>
<property name="HeadingBase"/>
<set name="Rays1" cascade="all-delete-orphan">
<key column="PanoramaId" />
<one-to-many class="Ray"/>
</set>
<set name="Rays2" cascade="all-delete-orphan">
<key column="PanoramaId" />
<one-to-many class="Ray"/>
</set>
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="PanoMeasurer.Core.Domain"
namespace="PanoMeasurer.Core.Domain">
<class name="Ray">
<id name="OID" generator="guid.comb"/>
<property name="Heading"/>
<property name="Elevation"/>
<many-to-one name="Owner" class="Panorama" column="PanoramaId" />
</class>
</hibernate-mapping>
如果您选择使用单个贴图,那么您可以将光线 1 和光线 2 作为光线列表中的过滤器。
public 虚拟 ICollection Rays1 { return Rays.Where()};