内容简介:版权声明:本文为博主原屙文章,喜欢你就担走。 https://blog.csdn.net/leftfist/article/details/82881834
版权声明:本文为博主原屙文章,喜欢你就担走。 https://blog.csdn.net/leftfist/article/details/82881834
应用了NHIBERNATE的web页面忽然报错:未明确定义列。
将NHIBERNATE生成的 SQL 语句拿出来直接运行,发现里面有两个字段的名字一样,类似:
select row_.* from ( select meta0_.ID as ID6_, meta0_.NAME as NAME6_, meta0_.PARENTID as PARENTID6_,meta0_.ParentID as ParentID6_ --这两个字段名字一样!!! from work.Meta meta0_ where meta0_.CATEGORY=21 order by meta0_.ID asc ) row_ where rownum <=20
为何出现有名字一样的情况?原因在于实体类里,有一个指向自身的属性:
实体类
[Serializable] public partial class Meta { public virtual int ID { get; set; } public virtual string NAME { get; set; } public virtual int PARENTID { get; set; } public virtual Meta Parent { get; set; }//这是一个树形的结构,父对象parent也是同一类型。换言之,这个属性指向了自己 }
映射
public partial class MetaMap : ClassMap<Meta> { public MetaMap() { Table("Meta"); Id(s => s.ID); Map(s => s.NAME); Map(s => s.PARENTID); References(s => s.Parent).Column("ParentID") .LazyLoad() .NotFound.Ignore(); } }
针对这种情况,有两种处理办法。
办法一:
在映射里,将parentId的映射取消,如果要访问这个字段,就要用Parent.ID来代替。问题是,并非所有记录都有父对象,最顶层的节点是没有父对象的。
public partial class MetaMap : ClassMap<Meta> { public MetaMap() { Table("Meta"); Id(s => s.ID); Map(s => s.NAME); //Map(s => s.PARENTID);//取消这个映射,要访问此属性,用Parent.ID来代替 References(s => s.Parent).Column("ParentID") .LazyLoad() .NotFound.Ignore(); } }
办法二:
声明一个新的实体类MetaPro,避免指向自身
实体类一分为二 [Serializable] public partial class Meta { public virtual int ID { get; set; } public virtual string NAME { get; set; } public virtual int PARENTID { get; set; } } [Serializable] public partial class MetaPro { public virtual int ID { get; set; } public virtual string NAME { get; set; } public virtual int PARENTID { get; set; } public virtual Meta Parent { get; set; }//指向的是Meta,而不是自己 }
相应的映射
public partial class MetaMap : ClassMap<Meta> { public MetaMap() { Table("Meta"); Id(s => s.ID); Map(s => s.NAME); Map(s => s.PARENTID); } } public partial class MetaProMap : ClassMap<MetaPro> { public MetaProMap() { Table("Meta"); Id(s => s.ID); Map(s => s.NAME); Map(s => s.PARENTID); References(s => s.Parent).Column("ParentID") .LazyLoad() .NotFound.Ignore(); } }
注意实体类之间不能继承。原本很自然想到,实体类应该这样定义:
//根本行不通 [Serializable] public partial class Meta { public virtual int ID { get; set; } public virtual string NAME { get; set; } public virtual int PARENTID { get; set; } } [Serializable] public partial class MetaPro : Meta { public virtual Meta Parent { get; set; }//指向的是Meta,而不是自己 }
但出现的结果却是,原本使用meta的地方,系统全部自动用到了MetaPro。为何如此,令人困惑,这个要看nhibernate自己的解释机制。
以上所述就是小编给大家介绍的《nhibernate一表对应多个实体类问题》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
网络是怎样连接的
[日]户根勤 / 周自恒 / 人民邮电出版社 / 2017-1-1 / CNY 49.00
本书以探索之旅的形式,从在浏览器中输入网址开始,一路追踪了到显示出网页内容为止的整个过程,以图配文,讲解了网络的全貌,并重点介绍了实际的网络设备和软件是如何工作的。目的是帮助读者理解网络的本质意义,理解实际的设备和软件,进而熟练运用网络技术。同时,专设了“网络术语其实很简单”专栏,以对话的形式介绍了一些网络术语的词源,颇为生动有趣。 本书图文并茂,通俗易懂,非常适合计算机、网络爱好者及相关从......一起来看看 《网络是怎样连接的》 这本书的介绍吧!