我剛剛有一個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的映射屬性?
因爲這個原因,我寫了一個「測繪測試儀」。但它是相當多的代碼。它測試實體是否可以存儲和檢索而不會丟失數據。可能是我獲得入場券,並找到時間釋放它的一天。 – 2010-06-01 11:18:14
+1顯示我如何獲得IdentifierPropertyName。正是我在找什麼! – 2012-10-25 21:52:25