新入职一个公司,有一个功能模块须要修改,看了一个离职同事代码,orm使用的是NHibernate,自己对EF还有NHibernate知道的不是不少,用的也不深。看到映射关系很头疼,实体类中嵌套各类实体类,不知道为何,查了资料才知道,主要为了一对多、多对一的关系。下面是找的资料,让我明白了一些。html
1.Fluent NHibernate让你再也不须要去写NHibernate的标准映射文件(.hbm.xml), 方便了咱们的代码重构,提供了代码的易读性,并精简了项目代码数据库
实现:spa
(1)、首先咱们经过nuget包管理器添加FluentNHibernate与NHibernate的引用。orm
(2)、编写实体类,注意实体的属性都是virtual//由于没使用过,可是来到公司之后才知道,不添加virtual操做实体类保存数据库会报错xml
(3)、实体类编写完成之后咱们用代码的方式实现对实体的映射htm
2.定义支持的关联属性对象
Cascade 指该对象在进行操做时关联到的子对象的操做类型blog
PropertyRef属性通常用来解决遗留数据库一对多关系的问题ip
PropertyRef被关联到此外键的类中的对应属性的名字,若没指定,使用被关联类的主键.get
PropertyRef不是数据库表中的字段名,而是定义的类中的属性名
3. 一对多HasMany<>() / 多对一 References<>()
3.1. 定义支持的关联属性
KeyColumn 表示主键名
Cascade表示级联取值,决定是否把对对象的改动反映到数据库中,因此Cascade对全部的关联关系都起做用, Cascade是操做上的连锁反映,Cascade取值多是如下:
AllDeleteOrphan 在关联对象失去宿主(解除父子关系)时,自动删除不属于父对象的子对象, 也支持级联删除和级联保存更新.
DeleteOrphan 删除全部和当前对象解除关联关系的对象
All 级联删除, 级联更新,但解除父子关系时不会自动删除子对象.
Delete 级联删除, 但不具有级联保存和更新
None 全部操做均不进行级联操做
SaveUpdate 级联保存(load之后若是子对象发生了更新,也会级联更新). 在执行save/update/saveOrUpdate时进行关联操做,它不会级联删除
Inverse() 所描述的是对象之间关联关系的维护方式,做用是:是否将对集合对象的修改反映到数据库中。Inverse表示对集合对象的修改会被反映到数据库中;为了维持两个实体类(表)的关系,而添加的一些属性,该属性可能在两个实体类(表)或者在一个独立的表里面,这个要看这双方直接的对应关系了: 这里的维护指的是当主控方进行增删改查操做时,会同时对关联关系进行对应的更新,Inverse是操做上的连锁反映。
NotFound 指定外键引用的数据不存在时如何处理: ignore会将数据不存在做为关联到一个空对象(null)处理。
用户表
public UserMap()
{
Table("Users");
Id(u => u.UserID).GeneratedBy.Identity() ;
Map(u => u.UserName);
Map(u => u.Password);
Map(u => u.CreateTime);
//一对一映射用户和用户信息表
HasOne<UserDetail>(u => u.Detail).Cascade.All().Fetch.Select();
//处理一对多关系的映射,一个User能够有多个订单,关联的数据表进行延迟加载,主键名为UserID,级联关系全部操做
HasMany<Order>(u => u.Orders).Cascade.All().Inverse().KeyColumn("UserID")LazyLoad();
}
订单表
public OrderMap()
{
Table("Orders");
Id(o => o.OrderID).GeneratedBy.Identity();
Map(o => o.Price);
Map(o => o.State).CustomType<OrderState>();
Map(o => o.Address);
Map(o => o.Coignee);
Map(o => o.CreateTime);
Map(o => o.Zip);
//处理多对一关系,多个Order能够属于一个User
References<User>(o => o.User).Column("UserID").Not.LazyLoad().Not.Insert().Not.Update();
}
注意: 关联的数据表进行懒加载,主键名为UserID,级联关系全部操做,cascade:All|delete|saveorUpdate,级联删除时需加上Inverse()
A :父表(外键对应的主键表) B:引用表(定义外键的表)
B与A 作级联更新 当 A 表数据修改时,B表相应数据也跟着修改
B与A 作级联删除 当 A 表数据删除时,B表相应数据也跟着删除
附上连接,想看完整的这个地址:https://www.cnblogs.com/shy1766IT/p/4855176.html