我正在使用 nHibernate 映射一个与 .NET 的 System.Web.SiteMapNode 非常相似的对象。为了使我的对象与这个 .NET 对象相似,我希望它包含 ParentNode、PreviousSibling、NextSibling 和 ChildNodes 复杂属性。
该表看起来有点像这样,并且可以更改:
- 编号(整数)
- 标题(字符串)
- 描述(字符串)
- 键(字符串)
- ParentNodeId (int)
- OrdinalPosition (int)
- 只读(布尔)
- 网址(字符串)
我可能有一些其他属性不需要模拟 .NET SiteMapNode 对象(如 isExternal 布尔值),但我认为这些对这个问题无关紧要。
我当前的映射如下所示:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="AthletesCafe.Core.Domain.System.SiteMap" assembly="AthletesCafe.Core">
<class name="SiteMapNode" table="SiteMapNode" lazy="true" >
<id name="ID" type="Int32" unsaved-value="0">
<column name="ID" not-null="true" unique="true" index="PK_SiteMapNode"/>
<generator class="identity" />
</id>
<property name="Title" column="Title" type="String" length="255" not-null="true" />
<property name="Description" column="Description" type="String" not-null="false" />
<property name="Url" column="Description" type="String" not-null="true" />
<property name="SiteMapKey" column="SiteMapKey" type="String" not-null="true" length="255" />
<property name="OrdinalPosition" column="OrdinalPosition" type="Int32" not-null="true" />
<property name="ReadOnly" column="ReadOnly" not-null="true" type="System.Boolean" />
<property name="IsExternal" column="IsExternal" not-null="true" type="System.Boolean" />
<many-to-one name="ParentNode" column="ParentNodeId" class="AthletesCafe.Core.Domain.System.SiteMap.SiteMapNode, AthletesCafe.Core"
access="field.pascalcase-underscore" not-null="false" />
<many-to-one name="PreviousNode" column="ParentNodeId" class="EatMyTrainer.Core.Domain.SiteMap.SiteMapNode, EatMyTrainer.Core" not-null="false" /></hibernate-mapping>
ParentNode 映射很简单,因为它应该只是一个简单的多对一映射。这是我的代码(未经测试,但我相信它是正确的):
<many-to-one name="ParentNode" column="ParentNodeId" class="AthletesCafe.Core.Domain.System.SiteMap.SiteMapNode, AthletesCafe.Core"
access="field.pascalcase-underscore" not-null="false" />
子节点的映射应该只是一个简单的包,它将带回 ParentNodeId 等于当前 ID 的所有 SiteMapNode 对象。我还没有写这个包,但我相信这没什么大不了的。
我似乎无法解决的问题是如何执行 Next/Previous Sibling 属性。该对象可以从每个节点的以下公式派生:
- PreviousSibling:与当前对象具有相同的ParentNode (ParentNodeId),并且其OrdinalPosition 应该比当前对象的OrdinalPosition 小一。
- NextSibling:与当前对象具有相同的ParentNode(ParentNodeId),并且其OrdinalPosition应该比当前对象的OrdinalPosition大一。
我认为这可以通过多对一映射的形式属性来实现。这可能吗?我还没有找到一个很好的例子来说明这是如何工作的。