Сохранение простого дерева с (Fluent-) NHibernate приводит к System.InvalidCastException - PullRequest
2 голосов
/ 29 декабря 2010

Кажется, есть проблема с рекурсивными структурами данных и (Fluent-) NHibernate или просто его я, являющийся полным идиотом ...

вот дерево:

открытый класс SimpleNode{

public SimpleNode ()
{
    this.Children = new List<SimpleNode> ();
}

public virtual SimpleNode Parent { get; private set; }
public virtual List<SimpleNode> Children { get; private set; }

public virtual void setParent (SimpleNode parent)
{
    parent.AddChild (this);
    Parent = parent;
}

public virtual void AddChild (SimpleNode child)
{
    this.Children.Add (child);
}

public virtual void AddChildren (IEnumerable<SimpleNode> children)
{
    foreach (var child in children) {
        AddChild (child);
    }
}

}

отображение:

открытый класс SimpleNodeEntity: ClassMap

{

public SimpleNodeEntity ()
{
    Id (x => x.Id);

    References (x => x.Parent).Nullable ();

    HasMany (x => x.Children).Not.LazyLoad ().Inverse ().Cascade.All ().KeyNullable ();
}

}

Теперь, когда я пытаюсь сохранить узел, я получаю следующее:

System.InvalidCastException: Невозможно привести от исходного типа к целевому типу.at (динамический метод-обертка) SimpleNode.(объект, объект [], NHibernate.Bytecode.Lightweight.SetterCallback) в NHibernate.Bytecode.Lightweight.AccessOptimizer.SetPropertyValues ​​(объект, объект []) в NHibernate.Tuple.Entity.PocoEntityTuplizer.SetPropertyValuesWith),1022 *

Моя настройка:

Mono 2.8.1 (в OSX), NHibernate 2.1.2, FluentNHibernate 1.1.0

1 Ответ

1 голос
/ 19 января 2011

Для справки: я вроде как обдумал проблему, заменив отношение «Дети» на отношение «ChildReferences», оставив фактические «Дети» в качестве переходных (они создаются через косвенное обращение «ChildReferences»):

...

public virtual IList&lt;ChildReference&gt; ChildReferences { get; private set; }

...

в отображении:

HasMany (x => x.ChildReferences).Cascade.All ();

public class ChildReference 
    {
        public virtual int ChildId { get; set; }
    }  

...

...