用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(一对一)

没啥心得

最新文章

  1. 执行命令行, 并获取输出字符(比如OSQL)
  2. ASCIITable: 演示 Arduino 串口输出的进阶功能
  3. 跟我一起学WCF(13)——WCF系列总结
  4. [LeetCode] 桶排序的特殊解,例 Sort Color
  5. selenium+python笔记1
  6. 深入浅出:Linux设备驱动之字符设备驱
  7. Stage3D学习笔记(三):使用GPU绘制一个图片
  8. SQL 查找存储过程及视图与自带函数
  9. 国内maven镜像
  10. iOS Sqlite3 Demo 及 FMDB Demo
  11. js星级评分点击星级评论打分效果--收藏--转载
  12. LeetCode_Integer to Roman
  13. 用scponly限制只能拷文件,不能登陆(MAC版)
  14. 从零开始搭建Salt Web之封装salt-api接口
  15. Cards and Joy CodeForces - 999F (贪心+set)
  16. ES搜索引擎基本操作
  17. 构建工具build tools
  18. File类相关操作
  19. Java 如何启用 ARM 虚拟机诊断
  20. # 20155337 2016-2017-2 《Java程序设计》第六周学习总结

热门文章

  1. 9. FILES
  2. 01-mysql中的数据类型
  3. phpstorm的全局操作快捷键ctrl+shift+f被搜狗占用处理方法
  4. 自制操作系统小样例——参考部分linux0.11内核源码
  5. ARM Linux 3.x的设备树(Device Tree)(转)
  6. LeetCode07--整数反转
  7. CodeForces 556 --Case of Fake Numbers
  8. mappedBy的具体使用及其含义
  9. AlertDialog自定义
  10. Hashtable和HashMap 的区别