Вдвойне связанное упорядоченное отображение дерева с помощью NHibernate - PullRequest
2 голосов
/ 12 марта 2009

Нам нужно отобразить простой класс с помощью 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; } }
}

В интернете есть серия учебных пособий на эту тему, но ни одна из них не содержит мелких неприятных подробностей: нам нужно сохранить порядок в детской коллекции. Мы пытались следовать отображению, но оно приводило к странным исключениям, создаваемым 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>

У кого-нибудь есть мысли?

1 Ответ

0 голосов
/ 17 марта 2009

Я не эксперт, но <key property-ref=...> выглядит странно для меня в этом использовании. Вы должны быть в состоянии сделать <key column="ParentID"/>, и NHibernate автоматически использует первичный ключ связанного класса - в данном случае сам.

Возможно, вам также понадобится установить список на inverse="true", поскольку связь является двунаправленной. [См. Раздел 6.8 в документации.]

...