NHibernate 代码映射实体类
时间:2022-07-23
本文章向大家介绍NHibernate 代码映射实体类,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
NHibernate 代码映射实体类
关于代码映射
NHibernate 3.2 自带了代码映射机制, 作为 xml 映射之外的一种映射方式, 由于推出的时间比较晚, 所以资料相对比较少, 而且与社区版的 Fluent Mapping 和 Attribute Mapping 不同, 有其独特的设计风格。
下面就通过一个实例来说明怎么使用 NHibernate 自带的代码映射。
实体关系
要映射的类关系图如下:
上图中有三个实体类, 他们之间的关系说明如下:
-
Product
与Store
之间是多对多关系; -
Store
与Employee
之间是一对多关系; -
Employee
与Store
之间是多对一关系;
使用代码映射
使用 xml 做实体类映射时, 推荐一个实体类对应一个 xml 文件, 用代码映射时也推荐这样, 一个实体类对应一个映射类, 一个映射类一个文件。
映射类继承自 ClassMapping<T>
, T
标识要映射的实体类, 如下所示:
public class ProductMapping : ClassMapping<Product> {
public ProductMapping() {
// 此处添加映射代码
}
}
映射到数据表
使用 Table
函数将类映射到制定的数据表:
Table("product");
标识映射
使用 Id
函数映射标识, NHibernate 提供了内置的工具类来简化代码:
Id(
m => m.Id,
map => {
map.Column("id");
map.Type(NHibernateUtil.Int32);
map.Generator(Generators.Identity);
}
);
属性映射
使用 Property
函数映射属性, NHibernate 提供了内置的工具类来简化代码:
Property(
m => m.Name,
map => {
map.Column("name");
map.Type(NHibernateUtil.String);
map.Length(20);
}
);
多对一映射
使用 ManyToOne
函数来映射多对一属性, 比如 Employee
的 Store
属性:
ManyToOne(
m => m.Store,
map => {
map.Class(typeof(Store));
map.Cascade(Cascade.All);
map.Column("store_id");
map.ForeignKey("employee_to_store");
}
);
一对多映射
使用 Bag
方法来映射一对多属性, 比如 Store
的 Staff
属性:
Bag(
m => m.Staff,
map => {
map.Table("employee");
map.Key(k => {
k.Column("store_id");
k.ForeignKey("employee_to_store");
});
},
rel => {
rel.OneToMany(map => map.Class(typeof(Employee)));
}
);
多对多映射
Store
与 Product
两个类之间是多对多映射, 映射代码如下:
Store
类的 Products
属性:
Bag(
m => m.Products,
map => {
map.Table("store_product");
map.Key(k => {
k.Column("store_id");
k.ForeignKey("store_product_to_store");
});
},
rel => rel.ManyToMany(map => {
map.Class(typeof(Product));
map.Column("product_id");
})
);
Product
类的 StoresStockedIn
属性:
Bag(
m => m.StoresStockedIn,
map => {
map.Table("store_product");
map.Key(k => {
k.Column("product_id");
k.ForeignKey("store_product_to_product");
});
},
rel => rel.ManyToMany(map => {
map.Class(typeof(Store));
map.Column("store_id");
})
);
将映射添加到配置
通过下面的代码将上面的映射添加到配置:
var config = new Configuration();
config.Configure("MySql.cfg.xml");
var mapper = new ConventionModelMapper();
mapper.AddMapping(new EmployeeMapping());
mapper.AddMapping(new StoreMapping());
mapper.AddMapping(new ProductMapping());
var mapping = mapper.CompileMappingForAllExplicitlyAddedEntities();
config.AddMapping(mapping);
导出到数据库
也可以向 xml 映射那样, 将映射导出到数据库, 创建对应的数据表以及表关系:
var schemaExport = new SchemaExport(config);
schemaExport.SetDelimiter(";");
schemaExport.Execute(true, true, false);
总结
与 xml 映射以及其它第三方映射相比, 使用 NHibernate 代码映射有下面几个优点:
- 不需要使用 xml 文件即可完成, 可以充分利用 IDE 智能提示, 重构, 以及编译时检查;
- 与 Attribute Mapping 相比, 对原来的 POCO 实体类没有污染 (Attribute) ;
- NHibernate 自带, 可以说是一等公民, 而 Fluent Mapping 是第三方维护的;
- 元宵快乐:看SQL大师们用SQL绘制的团圆
- Python Redis pipeline操作
- python concurrent.futures
- Deepmind的星际争霸2强化学习教程(1):建立环境与训练模型
- python contextlib 上下文管理器
- Django扩展自定义manage命令
- Elasticsearch分片、副本与路由(shard replica routing)
- EsRejectedExecutionException排错与线程池类型
- python重试(指数退避算法)
- 动手为王 | Oracle 数据库跨版本升级迁移实践
- 日志归档与数据挖掘
- Redis实现分布式锁
- Mybatis分页插件PageHelper的配置和使用方法
- 另类保存微信公众平台历史消息的方法 - 星标消息
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP一个比较完善的树形结构代码
- .Net Core in Docker极简入门(下篇)
- snoopy(强大的PHP采集类) 详细介绍
- 十分钟搭建自己的私有NuGet服务器-BaGet
- PHP遍历文件夹下的所有文件和文件夹
- Python 读写 csv 文件的三种方法
- 初识ABP vNext(1):开篇计划&基础知识
- 利用 urllib.request.urlretrieve 函数下载文件
- PHP中class.smtp类
- 解决PIL切圆形图片存在锯齿
- [Go] GO语言实战-为博客园增加gofly在线客服功能
- PHP表单提交参数验证类(可修改)
- Tensorflow MNIST CNN 手写数字识别
- Tensorflow 实现各种学习率衰减
- only integer scalar arrays can be converted to a scalar index