NHibernate中一般报列名XXX无效,都是由于Mapping 文件配置的时候,写错列名导致的。
在测试的时候,突然碰到报列名'elt'无效,第一反应自然也是去找列名了,可是,找了一圈,elt的影子都没有找到,更别说写错了的问题了。顿时间无语了,怎么没有的列名也会报错?难道见鬼了不成?
由NHibernate的机制可以知道,报这类错误肯定是在配置文件的问题 —— 因为没有其他有入口制造错误了,而且还是使用LazyLoad!
横了这条心了,就在配置文件里面找了,虽然心里没谱。肇事的MappingFile都排查了一遍,结果,在一个角落里,看到了一个bag配置,
<bag name="PBodys" table="PBodys" inverse="true" cascade="all-delete-orphan" generic="true" lazy="true" fetch="subselect">
<key column="CategoryId"/>
<many-to-many class="PBody" />
</bag>
竟然的发现,这里的关系竟然错了,本来应该是one-to-many的,这里变成了many-to-many,但在PBody中,这个关系是many-to-one。会不会是这个问题? 没谱,试下吧,至少也算是修正了一处Bug了。
重新编译,运行,直接过了! OMG,原来是这玩意儿,难怪我说在配置文件里面找不到elt文件呢。NHibernate里面使用的是elt作为默认的列名?为此,找到NHibernate的源文件,粗略的看了一下,在NHibernate.Mapping下的Collection.cs文件找到如下这句:
public const string DefaultElementColumnName = "elt";
看样子是了。
猜测: 在关系出错的时候,NHibernate尝试建立关系,但是由于关系建立之后没有找到对应的列名,所以直接用的是默认列名。
总结:由于时间关系没有深入查看这个问题导致的具体原因,但至少让我知道了,在使用NHibernate报列名无效的时候,在配置文件没有找到对应列名的时候,还应该检查相关的MappingFile中的关系。