文档章节

.net使用NHibernate设置一对多、多对一关系

兵荒马乱的青春
 兵荒马乱的青春
发布于 05/23 11:16
字数 1210
阅读 0
收藏 0

新入职一个公司,有一个功能模块需要修改,看了一个离职同事代码,orm使用的是NHibernate,本身对EF还有NHibernate知道的不是很多,用的也不深。看到映射关系很头疼,实体类中嵌套各种实体类,不知道为什么,查了资料才知道,主要为了一对多、多对一的关系。下面是找的资料,让我明白了一些。

1.Fluent NHibernate让你不再需要去写NHibernate的标准映射文件(.hbm.xml), 方便了我们的代码重构,提供了代码的易读性,并精简了项目代码

实现:

(1)、首先我们通过nuget包管理器添加FluentNHibernate与NHibernate的引用。

(2)、编写实体类,注意实体的属性都是virtual//因为没使用过,但是来到公司以后才知道,不添加virtual操作实体类保存数据库会报错

(3)、实体类编写完成以后我们用代码的方式实现对实体的映射

2.定义支持的关联属性

Cascade 指该对象在进行操作时关联到的子对象的操作类型

PropertyRef属性一般用来解决遗留数据库一对多关系的问题

PropertyRef被关联到此外键的类中的对应属性的名字,若没指定,使用被关联类的主键.

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

 

© 著作权归作者所有

上一篇: .net 委托
下一篇: npoi设置Excel边框
兵荒马乱的青春
粉丝 1
博文 56
码字总数 50912
作品 0
哈尔滨
程序员
私信 提问
NHibernate从入门到精通系列(2)——NHibernate环境与结构体系

内容摘要 NHibernate的开发环境 NHibernate的结构体系 NHibernate的配置 一、NHibernate的开发环境 NHibernate的英文官方网站为:http://nhforge.org/ NHibernate目前最新的版本是3.0.0.GA,...

长平狐
2012/06/11
845
0
比较 NHibernate 和实体框架

葡萄牙的一位开发者 Ricardo Peres 最近发布了一篇文章,以看起来无偏见的形式对领先的两种 .NET ORM:NHibernate 和实体框架进行了比较。 我们建议考虑使用这两种框架的人都应该读下他的文章...

墙头草
2012/06/18
3.6K
4
NHibernate从入门到精通系列(1)——NHibernate概括

内容摘要 NHibernate简介 ORM简介 NHibernate优缺点 一、NHibernate简介 什么是?NHibernate?NHibernate是一个面向.NET环境的对象/关系数据库映射工具。对象/关系数据库映射(object/relati...

长平狐
2012/06/11
576
0
NHibernate 5.0 发布,对象关系映射解决方案

NHibernate 是一个基于.Net 的针对关系型数据库的对象持久化类库。Nhibernate 来源于非常优秀的基于Java的Hibernate 关系型持久化工具。NHibernate 从数据库底层来持久化你的.Net 对象到关系...

周其
2017/10/16
1K
6
NHibernate 3.3.3 CR1 发布

NHibernate 发布小更新版本 3.3.3 的首个 CR 版,下载地址:NHibernate-3.3.3.CR1-bin.zip (8.7 MB) NHibernate 是一个基于.Net 的针对关系型数据库的对象持久化类库。Nhibernate 来源于非常...

oschina
2013/02/10
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

js中的super小结

1.this和super的区别: this关键词指向函数所在的当前对象 super指向的是当前对象的原型对象 2.super的简单应用 const person = {name:'jack'}const man = {sayName(){retur...

Jack088
7分钟前
1
0
W3C标准及其规范

万维网联盟(外语缩写:W3C)标准不是某一个标准,而是一系列标准的集合。 网页主要由三部分组成:结构(Structure)、表现(Presentation)和行为(Behavior)。 对应的标准也分三方面:结构...

元歌
12分钟前
0
0
IT兄弟连 Java语法教程 流程控制语句 循环结构语句1

循环语句可以在满足循环条件的情况下,反复执行某一点代码,这段被重复执行的代码被称为循环体,当反复执行这个循环体时,需要在合适的时候把循环条件该为假,从而结束循环,否则循环将一直执...

老码农的一亩三分地
21分钟前
0
0
OSChina 周二乱弹 —— 你一辈子都不可能跟她这么亲近

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享George Benson的单曲《Six Play》: 《Six Play》- George Benson 手机党少年们想听歌,请使劲儿戳(这里) ...

小小编辑
今天
878
11
优雅的关闭Spring Boot

优雅的关闭Spring Boot 1、实现 TomcatConnectorCustomizer 接口拿到Tomcat的连接获取 Tomcat连接池 2、实现 ApplicationListener<ContextClosedEvent> 监听服务器关闭事件,注册JVM钩子函数...

sowhat
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部