nhibernate一表对应多个实体类问题

栏目: ASP.NET · 发布时间: 6年前

内容简介:版权声明:本文为博主原屙文章,喜欢你就担走。 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一表对应多个实体类问题》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

程序是怎样跑起来的

程序是怎样跑起来的

[日] 矢泽久雄 / 李逢俊 / 人民邮电出版社 / 2015-4 / 39.00元

本书从计算机的内部结构开始讲起,以图配文的形式详细讲解了二进制、内存、数据压缩、源文件和可执行文件、操作系统和应用程序的关系、汇编语言、硬件控制方法等内容,目的是让读者了解从用户双击程序图标到程序开始运行之间到底发生了什么。同时专设了“如果是你,你会怎样介绍?”专栏,以小学生、老奶奶为对象讲解程序的运行原理,颇为有趣。本书图文并茂,通俗易懂,非常适合计算机爱好者及相关从业人员阅读。一起来看看 《程序是怎样跑起来的》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具