7

我在 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 项目,但是已经手动添加了集合类。它的工作原理应该非常简单,但基本上它从域创建数据库,添加带有子列表的记录,然后尝试使用集合类作为子列表的实现将其加载回另一个会话。由于延迟加载失败而引发断言。

4

1 回答 1

1

我自己终于找到了答案……问题是由于我使用了 ObservableListType。在 NHibernate 语义中,列表是实体的有序集合,如果您想为 IList 使用某些东西,那么您需要一个无序集合,即 Bag。

在阅读了有关此主题的另一个 StackOverflow 问题的答案后,我的尤里卡时刻到来了。

于 2013-12-12T04:56:05.807 回答