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

Chr*_*cht 4 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; }
}
Run Code Online (Sandbox Code Playgroud)

...和映射文件:

<?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>
Run Code Online (Sandbox Code Playgroud)

在这个简单的示例中,您可以立即看到问题:类中
有一个名为"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);
    }
}
Run Code Online (Sandbox Code Playgroud)

它几乎可以工作,除了一件事:IClassMetadata.PropertyNames返回 ID 之外的所有属性的名称.
要获取ID,我必须使用IClassMetadata.IdentifierPropertyName.

是的,我可以在一个新数组中保存.PropertyNames,将.IdentifierPropertyName添加到它并搜索数组.
但这对我来说很奇怪.
有没有更好的方法来获取所有映射属性,包括ID?

Ste*_*ger 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);
    }
}
Run Code Online (Sandbox Code Playgroud)