NHibernate2.1新特性之entity-name
本节内容
- 概览
- 典型实例
- 1.Domain
- 2.Mapping
- 3.Test
- 代码
- 结语
- 参考资料
概览
接着完成以前的NHibernate2.1新特性系列文章(NHibernate2.1新特性之Tuplizers、NHibernate2.1新特性之EntityMode.Map),这个系列主要摘取一些最新的例子来展示NHibernate2.1的新特性,等这个系列完成再准备另外一个新系列吧,因为关于NHibernate2.1的介绍还没有。这篇文章看看NHibernate2.1另外的一个新特性——实体名称(entity-name)。
实体名称(entity-name)在Class的Mapping中使用,一般而言,我们并不特意定义它,只有在其Class的Name的属性有点复杂的时候使用一个别名。在保存Domain的时候,ISession.Save()也有重载方法。
典型实例
这个实例使用继承映射,对于子类的名称比较复杂,我们可以使用entity-name来重新定义它的名称。
1.Domain
public abstract class Animal {public virtual int Id { get; private set; }public virtual string Description { get; set; } }public class Reptile : Animal {public virtual float BodyTemperature { get; set; } }public class Human : Animal {public virtual string Name { get; set; }public virtual string NickName { get; set; }public virtual DateTime Birthdate { get; set; } }public class Family<T> where T : Animal {public virtual int Id { get; private set; }public virtual T Father { get; set; }public virtual T Mother { get; set; }public virtual ISet<T> Childs { get; set; } }
2.Mapping
在数据库中我想每个Animal使用不同的表,所以需要三个不同的表。当然,所有"Kinds"的家庭只有一个表可能不够,因为我不可能有一个ForeignKey指向两个表。我需要一个表有强类型Family。使用NHibernate新的标签:实体名称(entity-name)可以做到。
<class name="Animal"><id name="Id" column="animalId"><generator class="hilo"/></id><property name="Description"/><joined-subclass name="Reptile"><key column="animalId"/><property name="BodyTemperature"/></joined-subclass><joined-subclass name="Human"><key column="animalId"/><property name="Name"/><property name="NickName"/><property name="Birthdate" type="Date"/></joined-subclass> </class><class name="Family`1[[Reptile]]" table="ReptilesFamilies"entity-name="ReptilesFamily"><id name="Id" column="familyId"><generator class="hilo"/></id><many-to-one name="Father" class="Reptile" cascade="all"/><many-to-one name="Mother" class="Reptile" cascade="all"/><set name="Childs" generic="true" cascade="all"><key column="familyId" /><one-to-many class="Reptile"/></set> </class><class name="Family`1[[Human]]" table="HumanFamilies"entity-name="HumanFamily"><id name="Id" column="familyId"><generator class="hilo"/></id><many-to-one name="Father" class="Human" cascade="all"/><many-to-one name="Mother" class="Human" cascade="all"/><set name="Childs" generic="true" cascade="all"><key column="familyId" /><one-to-many class="Human"/></set> </class>
从映射可以看出,一个类实现所有类型家庭,但使用两个不同的强类型持久化映射。
3.Test
先保存一些Domain,注意这里用到了重载session.Save(实体名称, 实例)方法。
using (var s = Sessions.OpenSession()) using (var tx = s.BeginTransaction()) {var rf = new Reptile { Description = "父" };var rm = new Reptile { Description = "母" };var rc1 = new Reptile { Description = "子1" };var rc2 = new Reptile { Description = "子2" };var rfamily = new Family<Reptile>{Father = rf,Mother = rm,Childs = new HashedSet<Reptile> { rc1, rc2 }};var hf = new Human { Description = "父亲", Name = "Father" };var hm = new Human { Description = "母亲", Name = "Mother" };var hc1 = new Human { Description = "孩子", Name = "Child" };var hfamily = new Family<Human>{Father = hf,Mother = hm,Childs = new HashedSet<Human> { hc1 }};//重载session.Save(实体名称, 实例)方法s.Save("ReptilesFamily", rfamily);s.Save("HumanFamily", hfamily);tx.Commit(); }
运行结果:
查询:
using (var s = Sessions.OpenSession()) using (var tx = s.BeginTransaction()) {IList<Family<Human>> hf = s.CreateQuery("from HumanFamily").List<Family<Human>>();Assert.That(hf.Count, Is.EqualTo(1));Assert.That(hf[0].Father.Name, Is.EqualTo("Father"));Assert.That(hf[0].Mother.Name, Is.EqualTo("Mother"));Assert.That(hf[0].Childs.Count, Is.EqualTo(1));IList<Family<Reptile>> rf = s.CreateQuery("from ReptilesFamily").List<Family<Reptile>>();Assert.That(rf.Count, Is.EqualTo(1));Assert.That(rf[0].Childs.Count, Is.EqualTo(2));tx.Commit(); }
运行结果:
代码
Source Project Home:http://code.google.com/p/yjinglee/
SVN CheckOut:http://yjinglee.googlecode.com/svn/trunk/
结语
上面的映射还是有点复杂,可以想想更有趣的是只持久化Family<T>类。因为我创建一张表(家族表)而我需要一些具体的类型Family<Reptile>和Family<Human>。在这种情况下我不能说Family<Reptile>是子类(在我的Domain中,没有Family<T>的父类 )。可以使用<discriminator>、discriminator-value和where标签,大家可以先想想映射怎么改写呢。
参考资料
NHibernate文档:4.4. Dynamic models
NHibernate2.1新特性之entity-name相关推荐
- Entity Framework Core 2.0的新特性
虽然EF Core 2.0存在大量槽点,但是它也给出了不少亮点.在本文中,我们将介绍这次发布版的部分亮点. \\ 数据库表切分(Table Splitting) \\ ORM常被吐槽是总是对所请求数据 ...
- Entity Framework Core 2.0 新特性
一.模型级查询过滤器(Model-level query filters) ef core2.0包含了一个新特性,我们叫他模型级查询过滤器(Model-level query filters).此特性 ...
- Entity Framework 4.3 中的新特性
原文地址:http://www.cnblogs.com/supercpp/archive/2012/02/20/2354751.html EF4.3于2月9号正式发布了,微软的EF小组最近一年开始发力 ...
- [转]C# 2.0新特性与C# 3.5新特性
C# 2.0新特性与C# 3.5新特性 一.C# 2.0 新特性: 1.泛型List<MyObject> obj_list=new List(); obj_list.Add(new MyO ...
- 返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 Web API
返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 Web API 原文:返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 ...
- Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC
http://sishuok.com/forum/blogPost/list/7798.html 在之前的<跟我学SpringMVC>中的<第七章 注解式控制器的数据验证.类型转换及 ...
- java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合
java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合 比如,我有一张表: entity Category.java service CategoryServic ...
- ABAP 7.53 中的ABAP SQL(原Open SQL)新特性
S/4 HANA 1809 已经在上月发布,随之而来的是ABAP 7.53. 本文是更新文档中ABAP SQL的部分的翻译. 本次更新的内容较多,主要内容包括:Open SQL更名为ABAP SQL: ...
- EntityFramework Core 1.1有哪些新特性呢?我们需要知道
前言 在项目中用到EntityFramework Core都是现学现用,及时发现问题及时测试,私下利用休闲时间也会去学习其他未曾遇到过或者用过的特性,本节我们来讲讲在EntityFramework C ...
最新文章
- 深度强化学习的现在,将来与未来
- RocketMQ-什么是死信队列?怎么解决
- RTD-D项目总结(MATLAB)
- android 控件资源命名规范,Android 资源命名规范整理
- 新买的内置光驱读取光盘有杂音的解决办法
- DevPartner Studio Professional Edition 11 内存泄露检测使用
- ZBrush中如何实现智能对称
- C语言实现校运动会项目管理系统
- lfw分类 python_Python机器学习:PCA与梯度上升:009人脸识别与特征脸(lfw_people数据集)...
- Java实习日记(7)
- 6轴并联机器人示教器
- shell脚本中set -e作用
- 智能隐形眼镜的研究进展与挑战
- EgretInspector谷歌浏览器扩展
- 亿级(无限级)并发,没那么难
- 3、Vue+ElementUI制作用户登录页面
- 视频文件头解析--mkv
- [cesium] 基于Cesium的动态泛光效果示例
- 通过 PRTG EXE 高级监控脚本 + python 监控华为防火墙线路健康状态
- 黑客攻击入侵流程及常见攻击工具