【问题标题】:NHibernate slow startup, conditional loading of HBMs and "Association references unmapped class"NHibernate 启动缓慢,HBM 的条件加载和“关联引用未映射类”
【发布时间】:2010-09-16 14:33:16
【问题描述】:

背景

我们有几个项目/应用程序在同一个模型上运行。它们都有自己独特的实体/表,但也共享 1 个特定的通用实体/表。 IE。应用程序 A 需要的实体,应用程序 B 永远不会需要,但公用表除外,反之亦然。现在公用表与应用程序 A 的表以及应用程序 B 的表都有关系。 加载大量 HBM 时速度会变得相当慢,因此我们实现了一个系统,该系统仅加载当前正在运行的应用程序所需的 HBM。

问题

在应用程序 A 中,当我们现在访问公共表/实体时,如下所示:

session.Linq<CommonEntity> ().Where (...);

我们得到以下异常

NHibernate.MappingException: 关联引用未映射的类: (应用B的实体)

我希望 NHibernate 只有在我们显式尝试通过公共实体的关系访问应用程序 B 的表时才会中断,结果它不会中断,因为我们从未从应用程序 A 这样做。 但是很可惜。

问题

有没有办法配置 NHibernate 以延迟关系映射的验证,直到它被访问?

我们确实使用延迟加载。

【问题讨论】:

    标签: .net nhibernate model hbm


    【解决方案1】:

    配置是一次性操作,构建SessionFactory时配置必须100%一致。

    如果对你来说还是太慢,可以序列化配置。见http://github.com/ayende/Effectus/blob/master/Effectus/Infrastructure/BootStrapper.cs

    【讨论】:

    • 是的,我知道配置是一次性操作,但希望可以映射部分模型。但是,您的序列化提示是我们问题的答案。我已经实现了序列化,初步测试表明 SessionFactory 现在的构建时间是原来的 10% 到 20%。谢谢!
    【解决方案2】:

    我不知道有什么方法可以延迟验证,但我不这么认为。

    但是也许还有其他选择。您可以尝试为每个应用程序使用一组单独的映射文件。每个集合仅包含该应用程序所需的实体和公用表。

    公用表的映射文件不得包含创建与属于其他应用程序的表的关系的列。

    所以每个应用程序都有自己一致的实体集,并且会忽略未映射的列。

    【讨论】:

    • 是的,我确实想到了这一点。但是,我们可能会在同一个数据库上运行大量插件应用程序,共享一些表,并且当公共表上的数据库模式发生更改时,更新所有单独的模型将成为维护难题。此外,我们正在使用 LLBLGen 生成 NHibernate 实体和映射,对它不是很熟悉,我不知道它是否支持生成多个集合。可能会很好。
    猜你喜欢
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多