如何在NHibernate映射类中查找未映射的属性?

时间:2010-06-01 11:12:05

标签: nhibernate nhibernate-mapping

我刚刚遇到了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?

2 个答案:

答案 0 :(得分:6)

您可以使用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);
    }
}

答案 1 :(得分:1)

我知道有两种工具可以帮助解决这个问题:

但它们没有专门解决您使用未映射的属性时遇到的问题。最好的解决方案是编写好的单元测试,以确保要保留的属性正确保留。这很乏味但很必要。