NHibernate 报列名 'elt' 无效

nhibernate&.net  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中的关系。

Tuesday, July 24, 2012 | .NET技术 NHibernate

文章评论

No comments posted yet.

发表评论

Please add 4 and 3 and type the answer here:

关于博主

  一枚成分复杂的网络IT分子,属于互联网行业分类中的杂牌军。