本节内容

  • 引入
  • 方案1:直接加入
  • 方案2:巧用组件
  • 实例分析
  • 结语

引入

通过前面7篇的学习,有点乏味了~~~这篇来学习一个技巧。大家一起想想假设我要在Customer类中实现一个Fullname属性(就是Firstname和Lastname的组合)该怎么做呢?

方案1:直接加入

“我知道!改动Customer类,加入一个Fullname属性!即Customer.Fullname!”

“恩,全然正确......”

“这就意味着在Customer类中把Firstname和Lastname两个属性又一次改动组合为Fullname属性。这种话。假设有其他的类(像Vendor、Shiper)使用了Firstname和Lastname两个属性,这就须要改动非常多业务逻辑。那你的麻烦可就大了,还有什么方法吗?”

“.........”

方案2:巧用组件

NHibernate中。提供了组件(Component)和动态组件来帮助我们完毕这件事情。事实上组件在NHibernate中为了不同目的被反复使用。这里我们使用它来依赖对象

映射文件里,<component>元素把子对象的一些属性映射为父类相应的表的一些字段。然后,组件能够定义它们自己的属性、组件或者集合。

以下用两幅图显示组件和动态组件两个节点映射属性:

看看这些映射属性:

  • access(默认property):NHibernate用来訪问属性的策略
  • class(默认通过反射得到的属性类型):组件(子)类的名字
  • insert:被映射的字段是否出如今SQL的INSERT语句中
  • name:属性名propertyName
  • update:被映射的字段是否出如今SQL的UPDATE语句中
  • <property>子元素:为组件(子)类的一些属性与表字段之间建立映射
  • <parent>子元素:在组件类内部就能够有一个指向其容器的实体的反向引用

<dynamic-component>元素同意一个IDictionary作为组件映射,当中属性名相应字典中的键。这又是使用组件的还有一种使用方法。

知道上面的知识,我们该想想上面的问题该怎样利用组件来实现了吧。

实例分析

我们用一幅图来展示我们这节所说的一切:

開始动手吧。

1.新建Name类

namespace DomainModel.Entities
{
public class Name
{
public string Firstname { get; set; }
public string Lastname { get; set; }
public string Fullname
{
get
{
return Firstname + " " + Lastname;
}
}
}
}

简单的说。这个类用于组合Fullname属性。

2.改动Customer类

namespace DomainModel.Entities
{
public class Customer
{
public virtual int CustomerId { get; set; }
public virtual int Version { get; set; }
public virtual Name Name { get; set; }
}
}

改动Customer类。去除原来的Firstname和Lastname属性,加入Name属性。

这时Name作为Customer的一个组成部分。须要注意的是:和原来Firstname和Lastname属性一样。须要对Name的持久化属性定义getter和setter方法,但不须要实现不论什么的接口或声明标识符字段。

3.改动Customer映射

<?

xml version="1.0" encoding="utf-8" ?

>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="DomainModel" namespace="DomainModel">
<class name ="DomainModel.Entities.Customer,DomainModel" table="Customer">
<id name="CustomerId" column="CustomerId" type="Int32" unsaved-value="0">
<generator class ="native"></generator>
</id>
<version name="Version" column="Version" type="integer" unsaved-value="0"/>
<component name="Name" class="DomainModel.Entities.Name,DomainModel">
<property name="Firstname" column ="Firstname" type="string"
length="50" not-null="false" unique-key="UC_CustomerName"/>
<property name ="Lastname" column="Lastname" type="string"
length="50" not-null="false" unique-key="UC_CustomerName"/>
</component
>
</class>
</hibernate-mapping>

首先定义Component的一些属性,指定属性名和组件映射的类名。再使用<property>子元素,为Name类的Firstname、Lastname属性与表字段之间建立映射。

是不是非常easy~~

这时Customer表中还是CustomerId、Version、Firstname、Lastname字段。全然不须要改动数据库表结构哦。

这里须要注意两点:

  1. 就像全部的值类型一样,组件不支持共享引用。

    组件的值为空从语义学上来讲是专有的。

    每当又一次载入一个包括组件的对象,假设组件的全部字段为空。那么NHibernate将假定整个组件为空。对于绝大多数目的。这样假定是没有问题的。

  2. 组件的属性能够是NHibernate类型(包括集合、多对一关联以及其他组件)。嵌套组件不应该作为特殊的应用被考虑。NHibernate趋向于支持设计细粒度的对象模型。

4.编写方法

这时,我们须要改动或者又一次编写新的方法来实现我们想要的逻辑。

public IList<Customer> ReturnFullName(string firstname, string lastname)
{
return _session
.CreateQuery("select from Customer c where c.Name.Firstname=:fn and c.Name.Lastname=:ln")
.SetString("fn", firstname)
.SetString("ln", lastname)
.List<Customer>();
}

如今。我们訪问Customer的Firstname、Lastname属性,仅仅须要在原来的基础上通过Name訪问。比如上面改动的情况,看看上面图片上怎么訪问的吧。一目了然。

假设我们要加入一个Customer怎么办呢?代码片段例如以下所看到的:

var customer = new Customer() { Name = new Name() { Firstname = "YJing", Lastname = "Lee" } };

5.測试方法

有了上面的方法,我们编写一个測试用例測试一下这种方法吧:看看结果測试成功,OK。

[Test]
public void ReturnFullNameTest()
{
IList<Customer> customers = _relation.ReturnFullName("YJing","Lee");
foreach (Customer c in customers)
{
Assert.AreEqual("YJing Lee", c.Name.Fullname);
}
}

结语

这一篇像大家介绍一个使用组件技巧。通过组件能够改善我们的对象模型,而数据库结构不须要变化。通过这一篇的技巧,利用组件来映射来依赖对象,能够很连贯的引入NHibernate中的多表映射关系、集合等内容,这些才是NHibernate中的亮点。就连LINQ都比只是它。从下篇開始就来学习NHibernate中的闪光点。

NHibernate之旅(8):巧用组件之依赖对象的更多相关文章

  1. [转]NHibernate之旅(8):巧用组件之依赖对象

    本节内容 引入 方案1:直接添加 方案2:巧用组件 实例分析 结语 引入 通过前面7篇的学习,有点乏味了~~~这篇来学习一个技巧,大家一起想想如果我要在Customer类中实现一个Fullname属性 ...

  2. [NHibernate]组件之依赖对象

    目录 写在前面 文档与系列文章 组件之依赖对象 一个例子 总结 写在前面 周一至周四一直在成都出差,也一直没有更新博客了,一回到家第一件事就是扒一扒最近博客园更新的文章,然后把想看的收藏了,大概有20 ...

  3. NHibernate之旅系列文章导航

    NHibernate之旅系列文章导航 宣传语 NHibernate.NHibernate教程.NHibernate入门.NHibernate下载.NHibernate教程中文版.NHibernate实 ...

  4. NHibernate教程(8)--巧用组件

    本节内容 引入 方案1:直接添加 方案2:巧用组件 实例分析 结语 引入 通过前面7篇的学习,有点乏味了~~~这篇来学习一个技巧,大家一起想想如果我要在Customer类中实现一个Fullname属性 ...

  5. 基于MVC4+EasyUI的Web开发框架形成之旅--附件上传组件uploadify的使用

    大概一年前,我还在用Asp.NET开发一些行业管理系统的时候,就曾经使用这个组件作为文件的上传操作,在随笔<Web开发中的文件上传组件uploadify的使用>中可以看到,Asp.NET中 ...

  6. Fluent NHibernate之旅

    Fluent NHibernate 之旅 导航篇: [原创]Fluent NHibernate之旅开篇: [原创]Fluent NHibernate之旅二--Entity Mapping: [原创]F ...

  7. NHibernate之旅(18):初探代码生成工具使用

    本节内容 引入 代码生成工具 结语 引入 我们花了大量的篇幅介绍了相关NHibernate的知识.一直都是带着大家手动编写代码,首先创建数据库架构.然后编写持久化类和映射文件,最后编写数据操作方法.測 ...

  8. [转]NHibernate之旅(13):初探立即加载机制

    本节内容 引入 立即加载 实例分析 1.一对多关系实例 2.多对多关系实例 结语 引入 通过上一篇的介绍,我们知道了NHibernate中默认的加载机制——延迟加载.其本质就是使用GoF23中代理模式 ...

  9. NHibernate之旅(13):初探马上载入机制

    本节内容 引入 马上载入 实例分析 1.一对多关系实例 2.多对多关系实例 结语 引入 通过上一篇的介绍,我们知道了NHibernate中默认的载入机制--延迟载入.其本质就是使用GoF23中代理模式 ...

随机推荐

  1. Axure 9 面板折叠显示隐藏

    1  首先放置一个面板1作为点击事件: 2  另外一个面板2或者其他组建,将其设置为动态面板,然后隐藏 3  给面板1添加如下事件,即可: 4  我们点击面板1,可以实现展开隐藏面板2的动态效果

  2. HDU - 4544 湫湫系列故事——消灭兔子(优先队列+贪心)

    题目: 最近,减肥失败的湫湫为发泄心中郁闷,在玩一个消灭免子的游戏. 游戏规则很简单,用箭杀死免子即可. 箭是一种消耗品,已知有M种不同类型的箭可以选择,并且每种箭都会对兔子造成伤害,对应的伤害值分别 ...

  3. Python 软件开发目录规范

    目录规范: ATM  #工程文件夹 ------| bin  #用来存放可执行文件的 |----  start.py conf  #用来存放配置信息的 |----  settings.py lib  ...

  4. 零基础入门学习Python(8)--了不起的分支和循环2

    前言 上节课小甲鱼教大家如何正确的打飞机,其要点是判断和循环,判断就是该不该做某事,循环就是持续做某事 知识点 写一个程序 按照100分制,90分以上成绩为A,80到90为B,60到80为C,60以下 ...

  5. SQL-如何使用 MongoDB和PyMongo。

    先决条件 在开始之前,请确保已经安装了 PyMongo 发行版. 在 Python shell 中,下面的代码应该在不引发异常的情况下运行: >>> import pymongo 假 ...

  6. Borrowers

    Description I mean your borrowers of books - those mutilators of collections, spoilers of the symmet ...

  7. HDU 2815 扩展baby step giant step 算法

    题目大意就是求 a^x = b(mod c) 中的x 用一般的baby step giant step 算法会超时 这里参考的是http://hi.baidu.com/aekdycoin/item/2 ...

  8. 【Eclipse+IntelliJ反编译】Eclipse/IntelliJ IDEA反编译查看源码及注释

    怎么用IDE查看第三方jar包的源码和注释,IntelliJ IDEA自带反编译器,Eclipse装个插件即可,不能看注释就麻烦了,总不能去找API文档吧,现在终于掌握了,下面给出解决方案,供大家参考 ...

  9. codevs——1081 线段树练习 2

    1081 线段树练习 2  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题解       题目描述 Description 给你N个数,有两种操作 1:给 ...

  10. hdfs是什么?

    参考:https://www.cnblogs.com/shijiaoyun/p/5778025.html hadoop分布式文件系统 1.hdfs是一个分布式文件系统,简单理解就是多台机器组成的一个文 ...