Свободные соглашения нарушают ленивую загрузку? (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 по этой теме.