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

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

1、References(关联,可用于多对一,一对一)
2、HasMany(一对多)
3、HasOne(一对一)

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

比如说,主表的ID是个自增的字段,或者应用序列号(sequence)的字段。然后从表有个相应的字段关联了主表的ID。很明显,要先获得这个主表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(一对一)
没啥心得,一般用References就够用了。

示例:
实体类:

    [Serializable]public partial class Task_Dounit  {public virtual int ID{get; set;}public virtual string UNIT_NAME { get; set; }public virtual long TASK_ID{get; set;}public virtual Task TASK {get; set;}}

映射:

        public Task_DounitMap(){Table($"Task_Dounit");Id(s => s.ID).GeneratedBy.Sequence($"SEQ_Task_DoUnit");Map(s => s.TASK_ID);References(s => s.TASK).Column("TASK_ID").LazyLoad()          //延迟加载.NotFound.Ignore()    //左对齐?.Not.Insert()              //不参与新增.Not.Update();           //不参与修改}

这里面不参与新增和修改很重要,因为我们只是想拿到相关对象的信息而已,并不想改变什么。

nhibernate的关系相关推荐

  1. 从java中的hibernate看Ado.net 与NHibernate的关系

    看了许多人的文章,将Ado.net 与NHibernate看作类似的东西,频繁将两者进行比较.对于那些朋友的观点,我不认同!      我认为ado.net 和 nhibernate是完全不同层次的东 ...

  2. 关于NHibernate中关系表的操作

    Nhibernate中的inverse属性负责维护关系表. 数据关系图 单方维护关系表 /// <summary> /// 1)创建User /// 2)建立Group并将User添加到G ...

  3. [NHibernate] NHibernate对象关系映射工具了解

    NHibernate是把Java的Hibernate核心部分移植到Microsoft .NET Framework上.它是一个对象关系映射工具,其目标是把.NET对象持久化到关系数据库. NHiber ...

  4. Nhibernate 基础关系映射

    多对一 <many-to-one name="OrderEntity" column="OrderID" class="MedicalSyste ...

  5. 框架:NHibernate学习目录

    NHibernate 基本配置 (第一篇) 摘要: 使用NHibernate最重要的一步就是配置,如果连NHibernate都还没有跑的起来,谈何学习.今天就来详解一下NHibernate的配置.一. ...

  6. 各种好用的代码生成器

    1:CodeSmith   一款人气很旺国外的基于模板的dotnet代码生成器 官方网站:http://www.codesmithtools.com 官方论坛:http://forum.codesmi ...

  7. 各种好用的代码生成器(C#)

    1:CodeSmith 一款人气很旺国外的基于模板的dotnet代码生成器 官方网站:http://www.codesmithtools.com 官方论坛:http://forum.codesmith ...

  8. DotNet 资源大全

    Awesome DotNet,这又是一个 Awesome XXX 系列的资源整理,由 quozd 发起和维护.内容包括:编译器.压缩.应用框架.应用模板.加密.数据库.反编译.IDE.日志.风格指南等 ...

  9. 【转】对ASP.NET程序员非常有用的85个工具

    介绍 这篇文章列出了针对 ASP.NET 开发人员的有用工具. 工具 1. Visual Studio Visual Studio Productivity Power tool:Visual Stu ...

最新文章

  1. OpenCV立体声匹配 stereo matching将L和R图像转换为视差和点云的实例(附完整代码)
  2. ASP.NET 自定义控件从入门到精通3补充
  3. python如何调用参数配置文件_【Python学习笔记七】从配置文件中读取参数
  4. 想买一辆别克GL8用做家庭用车,跑长途自驾游可以吗?
  5. ipfs+eth部分资料
  6. 强化学习在游戏中的作用_游戏中的强化学习
  7. MacOS Ventura 13.0 Beta1 (22A5266r) 带 OC 0.8.1 / Cl 5146 / PE 三分区原版黑苹果镜像
  8. CentOS7 yum 安装 maven
  9. Saltstack入门到精通教程(五):Jinja详解
  10. Python顺序结构
  11. 摄影常用词:光圈、快门、曝光、底片、ISO、焦距、景深
  12. android 字体设置为中等粗细
  13. 数学建模PPT(三)
  14. 图、邻接矩阵、广度与深度优先、生成树
  15. Java中带返回值的线程池Future
  16. 【kimol君的无聊小发明】—用python写截屏小工具
  17. 前端工程师拿30K月薪真的很难吗?
  18. Java毕设项目自行车在线租赁管理系统2021(java+VUE+Mybatis+Maven+Mysql)
  19. Unreal Blueprint API Reference[Add Documentation Node...]
  20. python学习心得总结

热门文章

  1. vue-router(妙味课堂)
  2. UIL 算法学习 Structure Based User Identification across Social Networks
  3. Spring之XML解析
  4. Glide Picasso Fresco UIL 图片框架 缓存 MD
  5. 基于glut的OpenGL框架(一)
  6. 如何制定企业5s管理制度手册?
  7. 怎么用EDIUS让滚动字幕停下来
  8. 安卓模拟器安装教程_安卓终端模拟器-安卓命令行入门教程系列(新手的福利)
  9. SkeyeVSS矿山采盗监控系统智能化管控非法采矿解决方案
  10. 图说Twitter简史 Twitter四周年回顾