我刚刚有一个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的映射属性?
因为这个原因,我写了一个“测绘测试仪”。但它是相当多的代码。它测试实体是否可以存储和检索而不会丢失数据。可能是我获得入场券,并找到时间释放它的一天。 – 2010-06-01 11:18:14
+1显示我如何获得IdentifierPropertyName。正是我在找什么! – 2012-10-25 21:52:25