NHibernate: неинициализированный прокси передан в save () и каскад

Я продолжаю получать исключение NHibernate.PersistentObjectException при вызове session.Save () из-за неинициализированного прокси, переданного в save (). Если я буду возиться с настройками каскада, я могу убрать его, но тогда дочерние объекты не сохраняются.

Единственное другое исправление, которое я нашел, - это добавление следующего в мой DefaultSaveEventListener.

    protected override bool ReassociateIfUninitializedProxy(object obj, global::NHibernate.Engine.ISessionImplementor source)
    {
        if (!NHibernateUtil.IsInitialized(obj))
            NHibernateUtil.Initialize(obj);

        return base.ReassociateIfUninitializedProxy(obj, source);
    } 

Очевидно, это не идеальное решение.

Любые идеи?


person jonnii    schedule 15.10.2008    source источник
comment
Вы когда-нибудь находили лучшее решение для этого? На данный момент мне нужно использовать подход, о котором вы упомянули, переопределив ReassociateIfUninitializedProxy.   -  person Luke Smith    schedule 16.02.2009
comment
Я пока не нашел решения ...   -  person jonnii    schedule 04.06.2009
comment
Вы наблюдаете эту проблему со всеми вашими объектами или с одним конкретным объектом? если это один конкретный объект, можете ли вы обновить вопрос с помощью своей модели и сопоставления?   -  person Baz1nga    schedule 16.07.2011


Ответы (3)


Простого наличия настраиваемого подкласса DefaultSaveEventListener, не содержащего переопределенного или расширенного поведения, достаточно, чтобы вызвать это исключение для меня, используя следующую конфигурацию Xml:

<event type="save-update">
    <listener class="MyNamespace.MyCustomSaveEventListener, MyAssembly" />
</event>

Я продолжаю это обсуждение в этом вопросе .

Обновление:

Я ошибочно получил от DefaultSaveEventListener вместо DefaultSaveOrUpdateEventListener, изменение суперкласса решило эту проблему.

person Rabid    schedule 22.07.2010
comment
Ах, глупый, я получал от DefaultSaveEventListener вместо DefaultSaveOrUpdateEventListener, изменение суперкласса решило эту проблему. - person Rabid; 22.07.2010
comment
+1 - Это было причиной - и исправлением - моей ошибки. Я бы посоветовал переместить ваш комментарий к вашему ответу, потому что он полезен и является точной причиной, по которой кто-то может получить эту ошибку. - person Remi Despres-Smyth; 22.03.2011

Вы пытаетесь работать с дочерним объектом, который находится в списке на корневой совокупной сущности? Если да, то вам нужно работать с корнем, перейти к дочернему, внести изменения и сохранить root, а не дочерний.

person Joe    schedule 14.07.2009
comment
Я больше не работаю над этим проектом, но думаю, что это могло быть причиной. - person jonnii; 15.07.2009

У меня была аналогичная проблема.

Исправить было просто: use ISession.Get(), а не ISession.Load().

person mathieu    schedule 29.05.2010
comment
Я получаю эту ошибку, и у меня нет ссылок на ISession.Load или какие-либо его перегрузки. - person Rabid; 22.07.2010