2010-09-13 39 views
1

背景NHibernate的緩慢啓動,HBMS有條件的加載和「協會引用未映射類」

我們已經流失了相同型號的幾個項目/應用程序。它們都有自己獨特的實體/表格,但也共享1個特定的通用實體/表格。 也就是說應用程序A所需的實體永遠不會被應用程序B要求,除了公用表以外,反之亦然。現在公用表與應用程序A的表以及應用程序B的表有關係。 加載大量HBM時,事情變得相當緩慢,所以我們實現了一個只加載當前運行的應用程序所需的HBM的系統。

問題

在應用程序A,當我們現在訪問的公共表/實體,像這樣:

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

我們得到下面的異常

NHibernate.MappingException : 協會參考未映射類: (應用B的實體)

我希望如果我們通過公共實體的關係顯式地嘗試訪問應用程序B的表,並且結果它不會因爲我們從應用程序A不這樣做而破壞NHibernate將會中斷。 但唉。

問題

是否存在一種配置,直到它被訪問NHibernate的延遲一個映射關係的驗證的方法嗎?

我們使用延遲加載。

回答

2

配置是一次性操作,並且配置必須在構建SessionFactory時100%一致。

如果它對你來說仍然太慢,可以將配置序列化。見http://github.com/ayende/Effectus/blob/master/Effectus/Infrastructure/BootStrapper.cs

+0

是的我知道配置是一次性操作,但希望可以映射部分模型。但是,您的序列化提示是我們問題的答案。我已經實現了序列化,並且初步測試顯示SessionFactory現在構建在原始時間的10%到20%之間。感謝名單! – 2010-09-15 05:05:56

1

我不知道延遲驗證的方法,但我不這麼認爲。

但也許有另一種選擇。您可以嘗試爲每個應用程序使用一組單獨的映射文件。每個集合只包含該應用程序和公共表所需的實體。

公用表的映射文件不得包含與屬於其他應用程序的表建立關係的列。

因此,每個應用程序都有自己一致的實體集,並且會忽略未映射的列。

+0

是的,我的確想到了這一點。但是,我們可能會在同一個數據庫上運行大量的插件應用程序,共享一些表,並且在公用表上更改數據庫模式時,更新所有單獨的模型將會成爲一項維護工作。此外,我們使用LLBLGen來生成NHibernate實體和映射,並且不太熟悉它,我不知道它是否支持生成多個集合。這很可能。 – 2010-09-16 11:37:07