IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]nhibernate的关系

    leftfist发表于 2016-11-06 16:39:26
    love 0

    用nhibernate,觉得比较难把握的是其中表间的关系。

    我用的是Fluently Nhibernate,直接用代码,而不是XML来书写代码与数据表的映射。其中表间关系有3种:

    1、References(多对一)
    2、HasMany(一对多)
    3、HasOne(一对一)

    1、References(多对一)
    用于从表映射主表。常与主表映射从表的HasMany一起使用,可在同一事务中,让主表的ID和从表关联主表的ID一起生成。比如:

    /*实体类*/
    public class Master
    {//主表
        public virtual int ID{ get; set; }
        public virtual IList<Slave> Slaves { get; set; }
    }
    public class Slave
    {//从表
        public virtual int ID { get; set; }
        public virtual int MasterID { get; set; }
        public virtual Master Master { get; set; }
    }   
    
    /*映射*/
    public class MasterMap : ClassMap<Master>
    {//主表
        public MasterMap()
        {
            Table("Master");
            Id(s => s.ID).GeneratedBy.Sequence("SEQ_Master");
    
            HasMany<Slave>(s => s.Slaves)
                .KeyColumn("MasterID") //指的是关联表的关联字段(自动用本表的主键字去关联对方)
                .Cascade.All()
                .LazyLoad();
        }
    }
    public class  SlaveMap : ClassMap<Slave>
    {//从表
        public SlaveMap()
        {
            Table("Slave");
            Id(s => s.ID).GeneratedBy.Sequence("SEQ_Slave");
            Map(s => s.MasterID);
            References<Master>(s => s.Master).Not.LazyLoad().Column("MasterID");//本表的字段,关联主表的关键字
        }
    }
    
    /*数据库操作Insert*/
    Master master = new Master();
    IList<Slave> lisSlave = new List<Slave>()
    {
        new Slave(){ Master = master},//你中有我
        new Slave(){ Master = master},
        new Slave(){ Master = master}
    };
    master.Slaves = lisSlave;//我中有你
    
    masterService.Add(master);//插入到数据库

    这样子之后,从表里的字段MasterID都已自动赋上了正确的值。不必先插入主表记录,获得其ID,然后再手动赋给从表对象这么麻烦。

    PropertyRef
    在关系References 和 HasMany里都有这个属性。注意是实体类里的属性名,而不是字段名。

    property-ref:指定关联类的一个属性,这个属性将会和本外键相对应。如果没有指定,会使用对方关联类的主键(可选).property-ref属性只应该用来对付老旧的数据库系统,可能出现外键指向对方关联表的是个非主键字段(但是应该是一个惟一关键字)的情况。这是一种十分丑陋的关系模型。比如说,假设Product类有一个惟一的序列号,它并不是主键;

    2、HasMany(一对多)
    参考1

    3、HasOne(一对一)
    没啥心得



沪ICP备19023445号-2号
友情链接