Fluent NHibernate实战(原创)
Id(p => p.Ticketcode).GeneratedBy.Assigned().UnsavedValue(null);//指定策略主键传进来
为什么要取代XML文件呢?
a.XML不是实时编译的。当你的XML配置文件有错误时,你只有在运行时才能看到哪里出错。
b.XML是非常繁琐的。的确在NHibernate中的配置文件,xml节点非常简单,但是仍然掩盖不了XML文件本身的繁琐性。
c.映射文件中重复的属性设置。比如在xml中我们需要设置每个string类型的字段都不允许为空,长度大于1000,int型都得有个默认值为-1,这样最终的xml配置文件你会发现有很多的重复工作。
Fluent NHibernate如何克服这些缺陷呢?
Fluent NHibernate把这些配置为文件都转化为了C#代码,这样可以让你的mapping直接在编译时就完成。
下面是传统的HBM XML mapping文件和Fluent NHibernate的对比。
Fluent NHibernate的下载地址:http://github.com/jagregory/fluent-nhibernate
实战一 常用情况
建立的map映射
{
Table("LoginUser");
Id(p => p.LoginId).Unique();
References(p => p.LoginUserRank)
.LazyLoad()
.Not.Insert()
.Not.Update()
.NotFound.Ignore()
.Column("RankId");
HasMany(p => p.LoginUserAddressList)
.AsSet()
.LazyLoad()
.Cascade.Delete().Inverse()
.NotFound.Ignore()
.KeyColumn("LoginId");
HasManyToMany(p => p.DepartmentList)
.AsSet()
.LazyLoad()
.Cascade.Delete().Inverse()
.NotFound.Ignore().ParentKeyColumn("LoginId").ChildKeyColumn("DepartmentId")
.Table("LoginUser_Department");
}
实战二 关系表中字段名不同
{
Table("LoginUser");
Id(p => p.LoginId).UnsavedValue("any");
References(p => p.LoginUserRank)
.LazyLoad()
.Not.Insert()
.Not.Update()
.NotFound.Ignore()
.Column("RankCode");//当前表中的那个字段跟 LoginUserRank表的主键关联
//如果LoginUserRank表中的RankId非主键加上PropertyRef设置
HasMany(p => p.LoginUserAddressList)
.AsSet()
.LazyLoad()
.Cascade.Delete().Inverse()//由当前表维护关系
.NotFound.Ignore()
.KeyColumn("LoginCode");//当前表的主键跟LoginUserAddressList中的那个键相关联
//如果不是当前表的主键跟LoginUserAddressList关联 加上PropertyRef设置
HasManyToMany(p => p.DepartmentList)
.AsSet()
.LazyLoad()
.Cascade.Delete().Inverse()
.NotFound.Ignore()
.ParentKeyColumn("LoginCode")//当前表的主键跟LoginUser_Department中的那个键相关联
.ChildKeyColumn("DepartmentCode")//LoginUser_Department中的那个键跟Department的主键关联
.Table("LoginUser_Department");
}
实战三 关系表中字段名不同 并且关联字段非主键
Id(p => p.LoginId).UnsavedValue("any");
Map(p=>p.LoginCode);
References(p => p.LoginUserRank)
.Not.Insert()
.Not.Update()
.NotFound.Ignore()
.Column("RankCode").PropertyRef("RankCode");
HasMany(p => p.LoginUserAddressList)
.AsSet()
.LazyLoad()
.Cascade.Delete().Inverse()//由当前表维护关系
.NotFound.Ignore()
.KeyColumn("LoginCode").PropertyRef("LoginCode");
HasManyToMany(p => p.DepartmentList)
.AsSet()
.LazyLoad()
.Cascade.Delete().Inverse()
.NotFound.Ignore()
.ParentKeyColumn("LoginCode").PropertyRef("LoginCode")
.ChildKeyColumn("DepartmentCode").ChildPropertyRef("DepartmentCode")
.Table("LoginUser_Department");
子实体(Order)映射定义的东西就是父实体少了:与父实体关联的(多对一、一对多、多对多) 关系,并用一个指针来导航到父实体。
在“子”端通过many-to-one元素定义与“父”端的关联,从“子”端角度看这种关系模型是多对一关联(实际上是对Customer对象的引用)。下面看看many-to-one元素映射属性:
看看这些映射属性具体有什么意义:
- access(默认property):可选field、property、nosetter、ClassName值。NHibernate访问属性的策略。
- cascade(可选):指明哪些操作会从父对象级联到关联的对象。可选all、save-update、delete、none值。除none之外其它将使指定的操作延伸到关联的(子)对象。
- class(默认通过反射得到属性类型):关联类的名字。
- column(默认属性名):列名。
- fetch(默认select):可选select和join值,select:用单独的查询抓取关联;join:总是用外连接抓取关联。
- foreign-key:外键名称,使用SchemaExport工具生成的名称。
- index:......
- update,insert(默认true):指定对应的字段是否包含在用于UPDATE或INSERT 的SQL语句中。如果二者都是false,则这是一个纯粹的 “外源性(derived)”关联,它的值是通过映射到同一个(或多个)字段的某些其他特性得到或者通过触发器其他程序得到。
- lazy:可选false和proxy值。是否延迟,不延迟还是使用代理延迟。
- name:属性名称propertyName。
- not-found:可选ignore和exception值。找不到忽略或者抛出异常。
- not-null:可选true和false值。
- outer-join:可选auto、true、false值。
- property-ref(可选):指定关联类的一个属性名称,这个属性会和外键相对应。如果没有指定,会使用对方关联类的主键。这个属性通常在遗留的数据库系统使用,可能有外键指向对方关联表的某个非主键字段(但是应该是一个唯一关键字)的情况下,是非常不好的关系模型。比如说,假设Customer类有唯一的CustomerId,它并不是主键。这一点在NHibernate源码中有了充分的体验。
- unique:可选true和false值。控制NHibernate通过SchemaExport工具生成DDL的过程。
- unique-key(可选):使用DDL为外键字段生成一个唯一约束。
我们来建立“子”端到“父”端的映射,新建Order.hbm.xml文件,编写代码如下:
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DomainModel" namespace="DomainModel"><class name="DomainModel.Entities.Order,DomainModel" table="`Order`" ><id name="OrderId" column="OrderId" type="Int32" unsaved-value="0"><generator class="native" /></id><property name="OrderDate" column="OrderDate" type="DateTime"not-null="true" /><!--多对一关系:Orders属于一个Customer--><many-to-one name="Customer" column="Customer" not-null="true"class="DomainModel.Entities.Customer,DomainModel"foreign-key="FK_CustomerOrders" /></class> </hibernate-mapping>
Fluent NHibernate实战(原创)相关推荐
- [原创]Fluent NHibernate之旅
ORM大家都非常熟悉了吧,我相信也有很多朋友正在用自己或者一些公开的框架,而最常用而且强大的,非Hibernate了(Net中为NHibernate),网上的文档非常多,不过在博客园中,介绍NHibe ...
- Fluent NHibernate关系映射
1.好处:Fluent NHibernate让你不再需要去写NHibernate的标准映射文件(.hbm.xml), 方便了我们的代码重构,提供了代码的易读性,并精简了项目代码 实现: (1).首先我 ...
- 全自动迁移数据库的实现 (Fluent NHibernate, Entity Framework Core)
在开发涉及到数据库的程序时,常会遇到一开始设计的结构不能满足需求需要再添加新字段或新表的情况,这时就需要进行数据库迁移. 实现数据库迁移有很多种办法,从手动管理各个版本的ddl脚本,到实现自己的mig ...
- Fluent NHibernate之旅
ORM大家都非常熟悉了吧,我相信也有很多朋友正在用自己或者一些公开的框架,而最常用而且强大的,非Hibernate了(Net中为NHibernate),网上的文档非常多,不过在博客园中,介绍NHibe ...
- 使用Fluent NHibernate和AngularJS的Master Chef(第2部分)ASP.NET Core MVC
目录 在存储库中使用泛型 Angular客户端路由 1)注入ngRoute 2)配置Angular路由 Angular JS客户端控制器 1)注入"Add","Edit& ...
- 使用Fluent NHibernate和AngularJS的Master Chef(第1部分)ASP.NET Core MVC
目录 介绍 Master Chef Recipe数据模型UML 在Visual Studio 2015更新3中创建MasterChef应用程序 添加Fluent NHibernate数据模型 1)安装 ...
- Fluent NHibernate入门
一.Fluent NHibernate是什么. Fluent NHibernate提供了一个方法让你不再需要去写NHibernate的标准映射文件(.hbm.xml),而是可以把你的映射文件都使用C# ...
- Fluent NHibernate 官方示例(增加中文注释整理,稍有修改)
Fluent NHibernate 官方示例(增加中文注释整理,稍有修改) 为什么用 Fluent NHibernate ? 1.Examples.FirstProject 2.Examples.Fi ...
- 如何使用Fluent NHibernate
Fluent NHibernate 在我们使用数据库的时候,通常都要和其他的编程软件一起使用,如java.c++.c# 等等,那如何使它们交互使用,我们就说一下Fluent NHibernate,(注 ...
最新文章
- Nature Plants:河南大学王学路团队揭示大豆与根瘤菌匹配性的进化及其分子机制...
- 每天一点点之vue框架开发 - axios解决跨越问题
- define 解析依赖,判断状态,初始化/触发加载 --------require 同步加载(直接返回)/异步加载(创建匿名模块,判断状态,初始化/触发加载)
- nios pio interrupt 的使能
- 第六十七期:全球500强公司的2100万登录信息惊现于暗网上!
- superset docker 部署
- 【报告分享】2021中国数字化全景图谱与创新企业研究报告:数字浪潮下的创新力量.pdf(附下载链接)...
- 标准C时间与日期函数、内存函数
- PYTHON自动化Day9-发邮件、面向对象、类、私有、继承
- 完全卸载mysql数据库
- 【稀饭】react native 实战系列教程之数据存储
- 醉赤壁用计算机怎么,抖音醉赤壁女生版谁唱的 醉赤壁女生合唱歌词
- git常用命令(不定时更新)
- 《戴上“白帽子”的黑客们:把漏洞变成礼物》
- cmds(cmds数据)
- Go 标准库介绍一: Replacer
- fat,fat32,ntfs,ext2,ext3等 文件系统说明
- 畅想未来计算机和人工智能的应用,人工智能在生活中的应用及展望
- 【第五人格设计思路】守墓人·角色设计思路
- 2022年嵌入式开发就业前景怎么样?