我在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成员所需的客户ID)正在被未跟踪正确对象的uNhAddIns集合项替换?
更新:我创建了a test project demonstrating this issue,它没有直接引用uNhAddins项目,但是手动添加了集合类。它应该非常简单,但它基本上是从域创建数据库,添加带有子列表的记录,然后尝试使用集合类作为子列表的实现将其加载回另一个会话。由于延迟加载失败而抛出一个断言。
答案 0 :(得分:1)
我最终自己想出了答案......问题是由于我使用了ObservableListType。在NHibernate语义中,列表是有序实体集合,如果你想为IList使用某些东西,那么你需要一个无序集合,即一个Bag。
在阅读another StackOverflow question关于这个主题的答案之后,我发现了尤里卡时刻。