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?
您可以使用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)
| 归档时间: |
|
| 查看次数: |
1723 次 |
| 最近记录: |