Fluent惯例是否会破坏延迟加载? (uNhAddIns)

时间:2013-11-25 04:51:40

标签: wpf nhibernate orm fluent 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成员所需的客户ID)正在被未跟踪正确对象的uNhAddIns集合项替换?

更新:我创建了a test project demonstrating this issue,它没有直接引用uNhAddins项目,但是手动添加了集合类。它应该非常简单,但它基本上是从域创建数据库,添加带有子列表的记录,然后尝试使用集合类作为子列表的实现将其加载回另一个会话。由于延迟加载失败而抛出一个断言。

1 个答案:

答案 0 :(得分:1)

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

在阅读another StackOverflow question关于这个主题的答案之后,我发现了尤里卡时刻。