2010-06-01 214 views
4

我剛剛有一個NHibernate相關的問題,我忘了映射一個類的一個屬性。如何在NHibernate映射類中查找未映射的屬性?

非常簡單的例子:

public class MyClass 
{ 
    public virtual int ID { get; set; } 
    public virtual string SomeText { get; set; } 
    public virtual int SomeNumber { get; set; } 
} 

...和映射文件:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="MyAssembly" 
        namespace="MyAssembly.MyNamespace"> 

    <class name="MyClass" table="SomeTable"> 
     <property name="ID" /> 
     <property name="SomeText" />  
    </class> 

</hibernate-mapping> 

在這個簡單的例子,你可以同時看到問題:
有一個屬性在類中命名爲「SomeNumber」,但不在映射文件中。
所以NHibernate將不會映射它,它將始終爲零。

真實的類有更多的屬性,所以問題不容易看到,我花了相當長的時間才發現爲什麼SomeNumber總是返回零,即使我100%確定數據庫中的值是!=零。

所以,這裏是我的問題:

有一些簡單的方法,通過NHibernate的發現了這一點?
與類映射時的編譯器警告類似,但其某些屬性不是。
或者我可以運行的一些查詢向我展示了映射類中未映射的屬性......你明白了。

(此外,這將是很好,如果我能排除我真的不想映射的一些遺留列。)

編輯:
好吧,我看着你提出的一切決定去與元數據API ...看起來最容易理解我。
現在我知道要搜索什麼,我發現了一些幫助我開始使用的例子。
到目前爲止,我有這樣的:

Type type = typeof(MyClass); 

IClassMetadata meta = MySessionFactory.GetClassMetadata(type); 

PropertyInfo[] infos = type.GetProperties(); 

foreach (PropertyInfo info in infos) 
{ 
    if (meta.PropertyNames.Contains(info.Name)) 
    { 
     Console.WriteLine("{0} is mapped!", info.Name); 
    } 
    else 
    { 
     Console.WriteLine("{0} is not mapped!", info.Name); 
    } 
} 

它幾乎作品,除了一兩件事: IClassMetadata.PropertyNames返回所有屬性除了的ID的名稱。
要獲得ID,我必須使用IClassMetadata.IdentifierPropertyName。

是的,我可以保存.PropertyNames在一個新的數組中,添加.IdentifierPropertyName它並搜索數組。
但這看起來很奇怪。
有沒有更好的方式獲得全部包括ID的映射屬性?

+0

因爲這個原因,我寫了一個「測繪測試儀」。但它是相當多的代碼。它測試實體是否可以存儲和檢索而不會丟失數據。可能是我獲得入場券,並找到時間釋放它的一天。 – 2010-06-01 11:18:14

+0

+1顯示我如何獲得IdentifierPropertyName。正是我在找什麼! – 2012-10-25 21:52:25

回答

5

您可以使用NHibernate的元數據API來查找映射的屬性和反射來查找所有屬性。

編輯不,沒有其他方式列出所有屬性,包括id。這並不是說很難用:

foreach (PropertyInfo info in infos) 
{ 
    if (meta.PropertyNames.Contains(info.Name) || info.Name = meta.IdentifierPropertyName) 
    { 
     Console.WriteLine("{0} is mapped!", info.Name); 
    } 
    else 
    { 
     Console.WriteLine("{0} is not mapped!", info.Name); 
    } 
} 
+0

我們這樣做,它只發生在app-init一次,並在日誌上轉儲結果 – Jaguar 2010-06-01 11:45:58

+0

元數據API聽起來不錯...我試圖使用它,但我遇到了一個問題(見上,我編輯我的題)。 – 2010-06-08 06:24:59

+0

哦,是的,你是對的 - 這很簡單。很遺憾,我沒有想到這件事:-) – 2010-06-08 07:02:18

1

有兩個工具我所知道的,可以在這方面幫助:

但他們沒有具體解決您使用未映射屬性的問題。最好的解決方案是編寫好的單元測試,以確保您想要保留的屬性能夠正確保持。這是乏味但必要的。