使用 NHibernate 的双连接有序树映射

Posted

技术标签:

【中文标题】使用 NHibernate 的双连接有序树映射【英文标题】:Doubly connected ordered tree mapping using NHibernate 【发布时间】:2009-03-12 20:31:12 【问题描述】:

我们需要使用 NHibernate 映射简单的类:

public class CatalogItem

    private IList<CatalogItem> children = new List<CatalogItem>();

    public Guid Id  get; set; 
    public string Name  get; set; 
    public CatalogItem Parent  get; set; 
    public IList<CatalogItem> Children
    
        get  return children; 
            
    public bool IsRoot  get  return Parent == null;          
    public bool IsLeaf  get  return Children.Count == 0;  

互联网上有很多关于这个主题的教程,但没有一个包含一些令人讨厌的细节:我们需要在 Children 集合中保留顺序。我们尝试了以下映射,但它导致 NHibernate 抛出奇怪的异常(“非静态方法需要一个目标。”)。

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Domain.Model" assembly="Domain">
    <class name="CatalogItem"  lazy="false">
        <id name="Id" type="guid">
            <generator class="guid" />
        </id>
        <property name="Name" />

        <many-to-one name="Parent" class="CatalogItem" lazy="false" />

        <list name="Children" cascade="all">
            <key property-ref="Parent"/>
            <index column="weight" type="Int32" />
            <one-to-many not-found="exception" class="CatalogItem"/>
        </list>        
    </class>
</hibernate-mapping>

有人有什么想法吗?

【问题讨论】:

当我编译您的代码时,我收到一条错误消息,提示“在类 'CatalogItem' 中找不到属性 'Children' 的设置器”。 【参考方案1】:

我不是专家,但 &lt;key property-ref=...&gt; 在这种用法中对我来说看起来很奇怪。你应该能够做到&lt;key column="ParentID"/&gt;,NHibernate 将自动使用关联类的主键——在这种情况下是它自己。

您可能还需要将列表设置为inverse="true",因为关系是双向的。 [请参阅文档中的第 6.8 节。]

【讨论】:

以上是关于使用 NHibernate 的双连接有序树映射的主要内容,如果未能解决你的问题,请参考以下文章

NHibernate 中的 Lazy 是啥意思

NHibernate 2 + Fluent Nhibernate 中等信任

NHibernate代码监视

在使用 NHibernate 进行持久性的项目中测试数据模型

NHibernate 2.1.2 - 如何禁用反射优化器

React-konva 带箭头的双连接对象