NHibernate 2.1版本中,有哪些新特性涉及Entity?

2026-05-25 10:485阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1444个文字,预计阅读时间需要6分钟。

NHibernate 2.1版本中,有哪些新特性涉及Entity?

本节内容概览- 内容- 概览- 典型实例- 1. Domain- 2. Mapping- 3. Test- 代码- 结尾- 参考资料概览- 接口完成

NHibernate 2.1 新特性系列文章概述本系列文章深入探讨了 NHibernate 2.1 版本引入的新特性,包括 Tuplizers 和 EntityMode.Map 等重要功能。以下是对该系列文章的简要介绍:

1. Domain在这一部分,我们将探讨如何定义和使用 NHibernate 2.1 中的域模型,包括实体和集合的类型定义。

2. Mapping这一节将介绍如何配置 NHibernate 2.1 的映射文件,以及如何利用新的 Tuplizers 功能来优化性能。

3. Test本部分将提供一系列测试用例,展示如何验证 NHibernate 2.1 的新特性在实际项目中的应用。

代码在这一节中,我们将提供示例代码,展示如何实现和测试 NHibernate 2.1 的核心功能。

结尾文章将以总结的方式结束,回顾 NHibernate 2.1 的主要新特性及其带来的好处。

参考资料概览本文将引用相关的官方文档、博客文章和社区讨论,以提供更全面的信息。

接口完成文章将提供完成 NHibernate 2.1 新特性接口的步骤和方法。

本节内容

  • 概览
  • 典型实例
    • 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(); }

运行结果:

NHibernate 2.1版本中,有哪些新特性涉及Entity?

查询:

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:code.google.com/p/yjinglee/

SVN CheckOut: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

本文共计1444个文字,预计阅读时间需要6分钟。

NHibernate 2.1版本中,有哪些新特性涉及Entity?

本节内容概览- 内容- 概览- 典型实例- 1. Domain- 2. Mapping- 3. Test- 代码- 结尾- 参考资料概览- 接口完成

NHibernate 2.1 新特性系列文章概述本系列文章深入探讨了 NHibernate 2.1 版本引入的新特性,包括 Tuplizers 和 EntityMode.Map 等重要功能。以下是对该系列文章的简要介绍:

1. Domain在这一部分,我们将探讨如何定义和使用 NHibernate 2.1 中的域模型,包括实体和集合的类型定义。

2. Mapping这一节将介绍如何配置 NHibernate 2.1 的映射文件,以及如何利用新的 Tuplizers 功能来优化性能。

3. Test本部分将提供一系列测试用例,展示如何验证 NHibernate 2.1 的新特性在实际项目中的应用。

代码在这一节中,我们将提供示例代码,展示如何实现和测试 NHibernate 2.1 的核心功能。

结尾文章将以总结的方式结束,回顾 NHibernate 2.1 的主要新特性及其带来的好处。

参考资料概览本文将引用相关的官方文档、博客文章和社区讨论,以提供更全面的信息。

接口完成文章将提供完成 NHibernate 2.1 新特性接口的步骤和方法。

本节内容

  • 概览
  • 典型实例
    • 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(); }

运行结果:

NHibernate 2.1版本中,有哪些新特性涉及Entity?

查询:

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:code.google.com/p/yjinglee/

SVN CheckOut: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