我刚刚遇到了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之外的所有属性的名称。是的,我可以在一个新数组中保存.PropertyNames,将.IdentifierPropertyName添加到它并搜索那个数组。
但这对我来说很奇怪
有没有更好的方法来获取所有映射的属性,包括ID?
答案 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)
我知道有两种工具可以帮助解决这个问题:
但它们没有专门解决您使用未映射的属性时遇到的问题。最好的解决方案是编写好的单元测试,以确保要保留的属性正确保留。这很乏味但很必要。