2010-04-09 70 views
4

我正在處理的項目有一個遺留數據庫,其中包含大量用於改變應用程序行爲的信息。基本上我堅持的東西,我必須小心改變。NHibernate,遺留數據庫,外鍵不是

對我的問題。在這個數據庫中是一個表,在這個表中是一列。此列包含整數,並且此列中大多數已有數據的值爲零。

問題是這個列實際上是另一個實體的外鍵引用,它在數據庫模式中從未被定義爲這樣。

現在在我的新代碼中,我定義了我的Fluent-NHibernate映射,將此列作爲參考對待,以便我不必直接在我的代碼中處理實體標識。這工作正常,直到我遇到一個實體在這個列中的值爲0。

NHibernate認爲值爲0是一個有效的引用。當我的代碼嘗試使用該引用的對象時,我得到一個ObjectNotFoundException,因爲顯然沒有對象在我的數據庫中的ID爲0.

我該如何通過映射或某種約定(我使用Fluent -nhibernate),得到NHibernate處理ID爲0是相同的,如果它是NULL?

回答

1

我發現API告訴NHibernate忽略找不到的引用(NotFound.Ignore()),而不是拋出異常。我對所有提到的SetAttribute()我感到困惑,我在網上發現這是爲了比我使用的流利-nhibernate更老的版本。

0

我處於同樣的情況。 not-found = ignore的問題在於,即使它已經在原始查詢中運行,每次嘗試訪問該關係時都會重新找回關係。基本上,hibernate不存儲關於其他關係的記錄的事實。您可以在調試日誌中看到這一點。這是我目前項目的一個例子。

loading entity: 
attempting to resolve: 
object not resolved in any cache: 
Fetching entity: 
loading entity: 
Opened new IDbCommand, open IDbCommands: 1 
Building an IDbCommand object for the SqlString: SELECT townshipdo0_.TOWNSHIP_CODE as TOWNSHIP1_203_0_, townshipdo0_.TOWNSHIP_NAME as TOWNSHIP2_203_0_, townshipdo0_.TOWNSHIP_TYPE_CODE as TOWNSHIP3_203_0_, townshipdo0_.TOWN_ACTIVE_FLAG as TOWN4_203_0_, townshipdo0_.VERS as VERS203_0_ FROM VTTOW_TOWN_CODE townshipdo0_ WHERE townshipdo0_.TOWNSHIP_CODE=? 
binding ' ' to parameter: 0 
SELECT townshipdo0_.TOWNSHIP_CODE as TOWNSHIP1_203_0_, townshipdo0_.TOWNSHIP_NAME as TOWNSHIP2_203_0_, townshipdo0_.TOWNSHIP_TYPE_CODE as TOWNSHIP3_203_0_, townshipdo0_.TOWN_ACTIVE_FLAG as TOWN4_203_0_, townshipdo0_.VERS as VERS203_0_ FROM VTTOW_TOWN_CODE townshipdo0_ WHERE townshipdo0_.TOWNSHIP_CODE=:p0 

你可以看到它嘗試綁定',數據庫爲這個應用程序使用空的空間表示空(愚蠢的我知道)。但每次nhibernate遇到這種情況,它都會嘗試從數據庫中查找它,因爲它無法在緩存中找到記錄,也不知道它實際上是NULL。

如果我們可以在配置中指定要忽略的默認空值,那將會很不錯。目前解決此問題的唯一方法是使用查詢來加載您的關係,而不是依賴nhibernate生成的查詢。