2010-06-01 171 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

有两个工具我所知道的,可以在这方面帮助:

但他们没有具体解决您使用未映射属性的问题。最好的解决方案是编写好的单元测试,以确保您想要保留的属性能够正确保持。这是乏味但必要的。