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

如何在NHibernate映射类中查找未映射的属性?,nhibernate,nhibernate-mapping,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

我刚刚遇到了一个与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>
除了一件事外,它几乎能起作用: IClassMetadata.PropertyNames返回除ID之外的所有属性的名称。
要获取ID,我必须使用IClassMetadata.IdentifierPropertyName

是的,我可以将.propertyName保存在新数组中,将.IdentifierPropertyName添加到其中并搜索该数组。
但我觉得这很奇怪。

是否没有更好的方法来获取所有映射属性(包括ID)?

您可以使用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用于向我展示如何获得IdentifierPropertyName。正是我要找的!我们这样做,它只在app init发生一次,并将结果转储到日志元数据API听起来不错…我尝试使用它,但遇到了一个问题(见上文,我编辑了我的问题)。哦,是的,你是对的-它真的很简单。很遗憾,我自己没有想到这一点:-)
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);
    }
}