本节内容

  • 概览
  • 典型实例
    • 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相关推荐

  1. Entity Framework Core 2.0的新特性

    虽然EF Core 2.0存在大量槽点,但是它也给出了不少亮点.在本文中,我们将介绍这次发布版的部分亮点. \\ 数据库表切分(Table Splitting) \\ ORM常被吐槽是总是对所请求数据 ...

  2. Entity Framework Core 2.0 新特性

    一.模型级查询过滤器(Model-level query filters) ef core2.0包含了一个新特性,我们叫他模型级查询过滤器(Model-level query filters).此特性 ...

  3. Entity Framework 4.3 中的新特性

    原文地址:http://www.cnblogs.com/supercpp/archive/2012/02/20/2354751.html EF4.3于2月9号正式发布了,微软的EF小组最近一年开始发力 ...

  4. [转]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 ...

  5. 返璞归真 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 新特性之 ...

  6. Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC

    http://sishuok.com/forum/blogPost/list/7798.html 在之前的<跟我学SpringMVC>中的<第七章 注解式控制器的数据验证.类型转换及 ...

  7. java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合

    java8新特性: lambda表达式:直接获得某个list/array/对象里面的字段集合 比如,我有一张表: entity Category.java service CategoryServic ...

  8. ABAP 7.53 中的ABAP SQL(原Open SQL)新特性

    S/4 HANA 1809 已经在上月发布,随之而来的是ABAP 7.53. 本文是更新文档中ABAP SQL的部分的翻译. 本次更新的内容较多,主要内容包括:Open SQL更名为ABAP SQL: ...

  9. EntityFramework Core 1.1有哪些新特性呢?我们需要知道

    前言 在项目中用到EntityFramework Core都是现学现用,及时发现问题及时测试,私下利用休闲时间也会去学习其他未曾遇到过或者用过的特性,本节我们来讲讲在EntityFramework C ...

最新文章

  1. 深度强化学习的现在,将来与未来
  2. RocketMQ-什么是死信队列?怎么解决
  3. RTD-D项目总结(MATLAB)
  4. android 控件资源命名规范,Android 资源命名规范整理
  5. 新买的内置光驱读取光盘有杂音的解决办法
  6. DevPartner Studio Professional Edition 11 内存泄露检测使用
  7. ZBrush中如何实现智能对称
  8. C语言实现校运动会项目管理系统
  9. lfw分类 python_Python机器学习:PCA与梯度上升:009人脸识别与特征脸(lfw_people数据集)...
  10. Java实习日记(7)
  11. 6轴并联机器人示教器
  12. shell脚本中set -e作用
  13. 智能隐形眼镜的研究进展与挑战
  14. EgretInspector谷歌浏览器扩展
  15. 亿级(无限级)并发,没那么难
  16. 3、Vue+ElementUI制作用户登录页面
  17. 视频文件头解析--mkv
  18. [cesium] 基于Cesium的动态泛光效果示例
  19. 通过 PRTG EXE 高级监控脚本 + python 监控华为防火墙线路健康状态
  20. 黑客攻击入侵流程及常见攻击工具

热门文章

  1. 重绘(repaint)与渲染(reflow)
  2. 百度eCharts体验
  3. 请使用frameset/frameset完成以下功能
  4. Spring 第二遍 02 spring IOC应用
  5. SAE上传web应用(包括使用数据库)教程详解及问题解惑
  6. 怎样获得listview的第一个item?
  7. Puppet客户端自动安装脚本
  8. 17.跟金根回顾敏捷个人:技术研究之道
  9. LeetCode算法题-Nth Digit(Java实现)
  10. VR Cinema 来了!未来的影院也许是酱紫滴