我在 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 字段为空,并且尝试扩展订单会导致可怕的“非法访问加载集合”消息。
谁能告诉我我做错了什么和/或我需要做什么才能让它工作?我是否正确假设原始代理对象(通常包含延迟加载 Orders 成员所需的客户 ID)被未跟踪正确对象的 uNhAddIns 集合项替换?
更新:我创建了一个测试项目来演示这个问题,它没有直接引用 uNhAddins 项目,但是已经手动添加了集合类。它的工作原理应该非常简单,但基本上它从域创建数据库,添加带有子列表的记录,然后尝试使用集合类作为子列表的实现将其加载回另一个会话。由于延迟加载失败而引发断言。