【发布时间】:2013-12-09 16:50:11
【问题描述】:
我在 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 集合项替换?
更新:我创建了a test project demonstrating this issue,它没有直接引用 uNhAddins 项目,但是已经手动添加了集合类。它的工作原理应该非常简单,但基本上它从域创建一个数据库,添加一个带有子列表的记录,然后尝试使用集合类作为子列表的实现将其加载回另一个会话。由于延迟加载失败而引发断言。
【问题讨论】:
-
能否提供一个样例项目,让我试试看?我从未使用过 uNhAddIns,但想看看它。
-
感谢 Leo,我已经更新了问题,并提供了一个测试项目的链接来演示该问题。
标签: wpf nhibernate orm fluent unhaddins