Свободные соглашения нарушают ленивую загрузку? (UNhAddIns)

У меня есть простой класс сущности в приложении WPF, который по сути выглядит так:

public class Customer : MyBaseEntityClass
{
    private IList<Order> _Orders;
    public virtual IList<Order> Orders
    {
        get { return this._Orders; }
        set {this._Orders = new ObservableCollection<Order>(value);}
    }
}

Я также использую автомат Fluent в автономной утилите для создания файла конфигурации NHibernate, который затем загружается во время выполнения. Все это прекрасно работает, но есть очевидный удар по производительности из-за того, что я не передаю исходную коллекцию обратно в NHibernate, поэтому я пытаюсь добавить соглашение, чтобы NHibernate создавал коллекцию для меня:

public class ObservableListConvention : ICollectionConvention
{
    public void Apply(ICollectionInstance instance)
    {
        Type collectionType =
            typeof(uNhAddIns.WPF.Collections.Types.ObservableListType<>)
            .MakeGenericType(instance.ChildType);
        instance.CollectionType(collectionType);
    }
}

Как вы можете видеть, я использую одну из коллекций uNhAddIns, которая, как я понимаю, должна обеспечивать поддержку как соглашения, так и изменений INotification, но по какой-то причине это, похоже, нарушает отложенную загрузку. Если я загружу пользовательскую запись, как это...

var result = this.Session.Get<Customer>(id);

... тогда полю Orders присваивается экземпляр типа PersistentObservableGenericList, но его поля EntityId и EntityName имеют значение null, а попытка расширить заказы приводит к страшному сообщению "незаконный доступ к загрузке коллекции".

Может кто-нибудь сказать мне, что я делаю неправильно и / или что мне нужно сделать, чтобы заставить это работать? Правильно ли я предполагаю, что исходный прокси-объект (который обычно содержит идентификатор клиента, необходимый для отложенной загрузки элемента Orders) заменяется элементом коллекции uNhAddIns, который не отслеживает правильный объект?

ОБНОВЛЕНИЕ: я создал тестовый проект, демонстрирующий эту проблему, он не ссылается непосредственно на проект uNhAddins, но классы коллекции были добавлены вручную. Как это работает, должно быть довольно просто, но в основном он создает базу данных из домена, добавляет запись с дочерним списком и затем пытается загрузить ее обратно в другой сеанс, используя класс коллекции в качестве реализации для дочернего списка. Утверждение выброшено из-за сбоя отложенной загрузки.

1 ответ

Решение

Я НАКОНЕЦ выяснил ответ на этот вопрос сам... проблема была из-за моего использования ObservableListType. В семантике NHibernate список - это упорядоченная коллекция сущностей, если вы хотите использовать что-то для IList, вам нужна неупорядоченная коллекция, например, Bag.

Момент Эврика для меня наступил после прочтения ответа на другой вопрос Stackru по этой теме.

Другие вопросы по тегам