NHibernate初学者指南(6):映射模型到数据库之方式二

使用Fluent NHibernate自动映射

使用Fluent NHibernate自动映射,首先要将映射的实体放到一个命名空间中,这使得通知AutoMapper哪些实体和值对象包含在映射中更容易。建议在你的项目中创建一个Domain文件夹,将需要映射的实体和值对象放到这个文件夹中。

因为隐式映射实体和值对象,需要为AutoMapping定义约定和例外。我们通过实现一个继承自DefaultAutomappingConfiguration的配置类实现。

假设我们已经将所有的实体和值对象放在了相同的命名空间中,这个命名空间只包含domain类,我们就可以如下面的代码定义配置类:

public class OrderingSystemConfiguration : DefaultAutomappingConfiguration
{public override bool ShouldMap(Type type){return type.Namespace == typeof(Customer).Namespace;}
}

上面的代码告诉AutoMapping只映射那些和Customer实体有相同命名空间的类。

在AutoMapper工作之前,我们还需要告诉它更多的事情。我们必须告诉它在系统中谁是值对象。这可以在配置类中重写IsComponent方法实现,如下面代码所示:

public override bool IsComponent(Type type)
{var componentTypes = new[] { typeof(Name), typeof(Address) };return componentTypes.Contains(type);
}

配置系统使用自动映射,我们利用下面的代码:

var cfg = new OrderingSystemConfiguration();
var configuration = Fluently.Configure().Database(/* database config */).Mappings(m =>m.AutoMappings.Add(AutoMap.AssemblyOf<Employee>(cfg))).BuildConfiguration();

 

实战时间–使用自动映射

在这个例子中,我们想定义一个基本的领域模型,使用Fluent NHibernate提供的自动映射来映射我们的模型,然后让NHibernate根据映射为我们生成数据库架构:

1. 在VS中创建一个Console Application,名字为:AutoMappingSample。

2. 添加NHibernate.dll和FluentNHibernate两个程序集到项目中。

3. 在项目中新建一个Domain文件夹。

4. 分别添加以下类到Domain文件夹中:

Customer类

namespace AutoMappingSample.Domain
{public class Customer{public virtual int Id { get; set; }public virtual string CustomerName { get; set; }}
}

LineItem类

namespace AutoMappingSample.Domain
{public class LineItem{public virtual int  Id { get; set; }public virtual int  Quantity { get; set; }public virtual decimal UnitPrice { get; set; }public virtual string ProductCode { get; set; }}
}

Order类

namespace AutoMappingSample.Domain
{public class Order{public virtual int Id { get; set; }public virtual DateTime OrderDate { get; set; }public virtual Customer Customer { get; set; }public virtual IList<LineItem> LineItems { get; set; }}
}

5. 在项目中添加一个OrderingSystemConfiguration类,继承自DefaultAutomappingConfiguration。

6. 重写ShouldMap方法,如下面的代码:

namespace AutoMappingSample
{public class OrderingSystemConfiguration : DefaultAutomappingConfiguration{public override bool ShouldMap(Type type){return type.Namespace == typeof(Customer).Namespace;}}
}

7. 在Program类中添加如下using语句:

using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using FluentNHibernate.Automapping;
using AutoMappingSample.Domain;
using NHibernate.Tool.hbm2ddl;

8. 添加下面的代码到Program类的Main方法创建NHibernate配置。配置对象使用Fluent NHibernate的配置API创建用于自动映射。

var cfg = new OrderingSystemConfiguration();
var configuration = Fluently.Configure().Database(MsSqlConfiguration.MsSql2008).Mappings(m => m.AutoMappings.Add(AutoMap.AssemblyOf<Customer>(cfg))).BuildConfiguration();

注意为这个操作定义数据库字符串没有必要,因为我们不访问数据库,只是告诉NHibernate哪种类型的数据库。

9. 添加下面的代码创建并在控制台上显示SQL脚本:

var exporter = new SchemaExport(configuration);
exporter.Execute(true, false, false);

10. 添加下面的代码避免程序不经确认就退出:

Console.WriteLine("按回车退出:");
Console.ReadLine();

11. 运行程序,控制台输出如下:

automapping

使用ConfORM自动映射

ConfORM是NHibernate contributions的一部分,可从http://code.google.com/p/codeconform/downloads/list下载。确保下载的版本兼容你使用的NHibernate版本。

和Fluent NHibernate的AutoMapper一样,ConfORM使用约定隐式定义领域模型的映射。这些约定可以重写,也可以定义我们自己的约定。

实战时间–使用ConfORM映射模型

在这个例子中,我们再一次创建一个简单的领域模型并使用ConfORM为我们创建一个隐式的映射。然后我们使用NHiernate的schema exporter创建SQL脚本来创建兼容我们模型的数据库架构。

1. 打开VS,创建一个Console Application项目,名字为:ConfORMSample。

2. 添加对NHibernate.dll和ConfORM.dll程序集的引用到项目中。我使用的NHibernate版本是3.1的,所以ConfORM也是兼容3.1的ConfORM 1.0.1.5。

3. 在项目中创建一个Domain文件夹。

4. 添加上一个例子中的Customer,Order和LineItem类到Domain文件夹。

Customer类

namespace ConfORMSample.Domain
{public class Customer{public virtual int Id { get; set; }public virtual string CustomerName { get; set; }}
}

Order类

namespace ConfORMSample.Domain
{public class Order{public virtual int Id { get; set; }public virtual DateTime OrderDate { get; set; }public virtual Customer Customer { get; set; }public virtual IList<LineItem> LineItems { get; set; }}
}

LineItem类

namespace ConfORMSample.Domain
{public class LineItem{public virtual int  Id { get; set; }public virtual int  Quantity { get; set; }public virtual decimal UnitPrice { get; set; }public virtual string ProductCode { get; set; }}
}

5. 在Program类中添加如下using语句:

using ConfORMSample.Domain;
using ConfOrm;
using ConfOrm.NH;
using NHibernate.Cfg;
using NHibernate.Cfg.Loquacious;
using NHibernate.Dialect;
using NHibernate.Driver;
using NHibernate.Tool.hbm2ddl;

6. 在Program类的Main方法中,使用NHibernate提供的fluent配置API创建一个NHibernate配置对象:

var configuration = new Configuration();
configuration.DataBaseIntegration(db =>
{db.Dialect<MsSql2008Dialect>();db.Driver<SqlClientDriver>();
});

7. 添加如下代码,确定要映射的类型:

var types = typeof(Customer).Assembly.GetTypes().Where(t => t.Namespace == typeof(Customer).Namespace);

8. 创建一个类型为ObjectRelationalMapper的实例,如下面的代码所示:

var orm = new ObjectRelationalMapper();

9. 告诉映射器,应该为每一个类型创建一个表,如下所示:

orm.TablePerClass(types);

10. 创建映射,并将它们添加到配置对象,如下面的代码所示:

var mapper = new Mapper(orm);
var hbmMappings = mapper.CompileMappingFor(types);
configuration.AddDeserializedMapping(hbmMappings, "MyDomain");

11. 创建schema生成脚本,如下面的代码所示:

var exporter = new SchemaExport(configuration);
exporter.Execute(true, false, false);

12. 同样,添加下面的代码为避免程序未经确认就退出:

Console.Write("按回车退出:");
Console.ReadLine();

13. 运行程序,如下图所示:

ConfORM

没用编码和少量的配置,我们就使系统为我们的领域模型创建了一个隐式的映射,并导出为可以创建数据库架构的脚本。生成的脚本基于定义在ConfORM中的约定。所有的这些约定都可以重写,也可以根据需要添加自己的约定。

自动映射到此为止,下一篇介绍XML映射。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/404698.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32嵌入式系统FreeRTOS使用cJSON解析和构建JSON

一、环境 控制器STM32F407MDK5.34cJSON1.7.7 二、安装cJSON MDK中打开Pack Install&#xff0c;选择Generic下边MDK-Pack::cJSON&#xff0c;点击安装Install 安装成功后&#xff0c;在Manage Run-Time Environment 中找到Data Exchange&#xff0c;并选择cJSON&#xff0c;…

VC6启用运行时类型识别 (RTTI)

在程序中&#xff0c;当我们对多态类的基类指针使用typeid&#xff0c;就可以在运行时确定指针指向对象的实际类型&#xff0c;并输出对象类型的名字。 #include <cstdlib >#include <iostream >#include <typeinfo >usingnamespacestd; classB{ public …

爱快软路由设置DHCP多个LAN处于同一网段

&#xff08;0&#xff09;思路&#xff1a;eth0 启用扩展网卡&#xff0c;然后设置LAN1为DHCP。 &#xff08;1&#xff09;设置扩展网卡 &#xff08;2&#xff09;启用DHCP

[react] react16跟之前的版本生命周期有哪些变化?

[react] react16跟之前的版本生命周期有哪些变化&#xff1f; 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

变压器油参数

以下体胀系数参考百度百科&#xff1a; 水银1.8210^-4 纯水2.0810^-4 煤油9.010^-4 酒精1.110^-3 汽油1.2410^-3 氢气3.6610^-3 氧气3.6710^-3 氨气3.8010^-3 空气 3.67610^-3 二氧化碳3.74110^-3 一切气体 ≈1/273 甘油 4.910^-4 乙醇 7.510^-4 相关&#xff1a…

CSS布局教程:用DIV CSS实现国内经典式三行两列布局-CSS布局实例

我们碰到过很多的企业网站或其它小型的展示类网站&#xff0c;有一些共同的特点&#xff0c;即顶部放一个大的导航或BANNER&#xff0c;右侧是链接或图片&#xff0c;左侧放置内容&#xff0c;页面底部放置版权信息等。这样的形式是国内经典式的布局&#xff0c;我们这里不对它…

EC20模组使用MQTT库对接EMQX,基于STM32F407

一、说明 本lib库基于STM32F407编译&#xff0c;其他的cortexM4内核也支持&#xff0c;采用串口和EC20模组通信。 库包括两个文件&#xff1a;ec20_mqtt.h和ec20_mqtt.lib。使用时添加lib文件到工程中&#xff0c;头文件引用ec20_mqtt.h即可。 下载&#xff1a;https://gitee…

什么是I帧,P帧,B帧

From: http://blog.csdn.net/abcjennifer/article/details/6577934 视频压缩中&#xff0c;每帧代表一幅静止的图像。而在实际压缩时&#xff0c;会采取各种算法减少数据的容量&#xff0c;其中IPB就是最常见的。 简单地说&#xff0c;I帧是关键帧&#xff0c;属于帧内压缩。…

linux中的memory management和page mapping

1 首先要说的最简单的是在一个process在运行的时候&#xff0c;它看到的内存是这个样子的。3G以后是给kernel使用的运行和动态分配的内存的空间&#xff0c;注意因为是process所看到的&#xff0c;下面全部都是虚拟地址空间。如下&#xff1a; 2 然后需要说的是Linux Physical …

linux 使用paho C库实现mqtt客户端

一、下载 github 下载paho mqtt c库源码&#xff0c;编译安装库文件。 地址&#xff1a;https://github.com/eclipse/paho.mqtt.c 关键API&#xff1a;Paho Asynchronous MQTT C Client Library: MQTTAsync.h File Reference 说明&#xff1a;paho客户端库是纯c库&#xff…

Linux实验二报告

北京电子科技学院&#xff08;BESTI&#xff09; 实 验 报 告 课程&#xff1a;信息安全系统设计基础 班级&#xff1a; 201352 姓名&#xff1a;池彬宁 贺邦 学号&#xff1a;20135212 20135208 成绩&#xff1a; 指导教…

重学数据结构007——二叉查找树

之前的博客中提到过&#xff0c;我学习采用的参考书是《数据结构与算法分析——C语言描述》。这门书的组织安排与国内广泛实用的教材《数据结构——C语言版》比较不同。这本书描述了一些树和二叉树的概念&#xff0c;举例讲解了什么是树的三种遍历之后&#xff0c;就开始重点讲…

无线网卡共享Internet访问到电脑有线接口注意事项

一、共享网卡访问 网卡属性--共享--以太网 Note: 观察有线以太网的IPv4是否有Internet访问权限。Note&#xff1a;配置IPv4的NDS与无线网卡WLAN的属性一致。 二、有线网卡配置 Note&#xff1a;连接到有线网卡上的外接设备需要配置IP地址为192.168.137.xxx&#xff0c;处于同…

Nginx 多进程连接请求/事件分发流程分析

Nginx使用多进程的方法进行任务处理&#xff0c;每个worker进程只有一个线程&#xff0c;单线程循环处理全部监听的事件。本文重点分析一下多进程间的负载均衡问题以及Nginx多进程事件处理流程&#xff0c;方便大家自己写程序的时候借鉴。 一、监听建立流程 整个建立监听socket…

h264检测是I帧还是P帧

From: http://blog.csdn.net/zgyulongfei/article/details/7558031 今天在网上找了一些资料&#xff0c;知道了如何检测h264中的帧类型&#xff0c;在这里记录下来。 首先&#xff0c;贴出nal单元类型定义&#xff08;图从《新一代视频压缩编码标准H.264》摘录&#xff09;&am…

C#之out和ref区别

out与ref的区别总结&#xff1a;1.两者都是通过引用来传递。2.两者都按地址传递的&#xff0c;使用后都将改变原来参数的数值。3.属性不是变量&#xff0c;因此不能作为 out或ref 参数传递。4.若要使用 ref 或 out,方法定义和调用方法都必须显式使用 out、ref 关键字。5.rel可以…

一次ssh登录不成功的解决经历

一、列出解决过程中所有报错信息 ssh connection refused port 22Stopped OpenBSD Secure Shell server. Failed to start OpenBSD Secure Shell server.OpenSSL version mismatch. Built against 1010104f, you have 101000cf Unable to fetch some archives, maybe run apt-…

IOS自动化打包介绍

摘要 随着苹果手持设备用户的不断增加&#xff0c;ios应用也增长迅速&#xff0c;同时随着iphone被越狱越来越多的app 的渠道也不断增多&#xff0c;为各个渠道打包成了一件费时费力的工作&#xff0c;本文提供一种比较智能的打包方式来减少其带来的各种不便。 TAG Ios打包&…

win10 vscode 无法激活python 虚拟环境的解决办法

一、powershell中 python创建虚拟环境无法激活 二、管理员模式运行powershell&#xff0c;执行策略更改&#xff1a; Set-ExecutionPolicy RemoteSigned&#xff0c;输入y 三、vscode再次激活&#xff1a; .\flask-venv\Scripts\activate 激活成功。 四、退出虚拟环境&#x…

vscode 升级过后自带的四种终端

一、版本 二、终端 自带了四种默认配置终端&#xff0c;删除以前Edit in settings.json的“terminal.integrated.shell.windows”字段。 四种默认终端&#xff1a; powershellwslcmdjavaScript Debug Terminal