【问题标题】:Do Fluent conventions break lazy loading? (uNhAddIns)Fluent 约定会破坏延迟加载吗? (uNhAddIns)
【发布时间】: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


【解决方案1】:

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

阅读another StackOverflow question关于这个话题的答案后,我的灵光一现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    • 2020-12-20
    • 2012-04-29
    • 2011-05-09
    • 1970-01-01
    相关资源
    最近更新 更多