1,用代码配置Configure类。

上一篇“让代码跑起来”中,是通过在Web.config配置来实现Configure类的,NHibernate还提供了代码的方式。

把之前的配置都注释掉,然后修改Application_Start中创建SessionFactory的代码如下:

var configure = new Configuration()

.DataBaseIntegration(dbi =>

{

dbi.Dialect<MsSql2008Dialect>();

dbi.Driver<SqlClientDriver>();

dbi.ConnectionProvider<DriverConnectionProvider>();

dbi.ConnectionStringName = "SqlServer";

});

configure .AddAssembly("NHibernateDemo") ;

SessionFactory = configure.BuildSessionFactory();

以上的代码中,先创建了一个Configuration类的实例,然后调用DataBaseIntegration方法,设置要使用的数据库方言、驱动、连接管理、连接字符串;通过AddAssembly添加了当前的程序集,NHibernate会在这个程序集中寻找映射文件(User.hbm.xml)。

此时,运行下代码,完好如初。

2,用代码配置实体映射。

实体的映射文件,即User.hbm.xml也可以通过代码的方式实现。

删除User.hbm.xml,然后添加一个UserMap类,具体代码如下:

public class UserMap : ClassMapping<User>

{

public UserMap()

{

Table("NH_User");

Id<long>(u => u.Id, map =>

{

map.Column("Id");

map.Generator(Generators.Native);

});

Property<string>(u => u.Name);

}

}

映射类必须继承泛型类ClassMapping。在构造函数中,通过Table方法指定User类对应的数据表,如果不指定,则默认的表和实体类名一致;Id方法配置主键,指定Id为主键,并且指定的类型为long,映射到数据表的Id列;Generators.Native代表数据库主键自增的方式初始化主键的值,也可以自己实现初始化器并在此指定;普通的属性使用Property配置,对于User.Name,因为和表列明一致,所以没有指定对应的列。

因为使用代码来是新实体的映射,就不能再用 configure .AddAssembly("NHibernateDemo") 的方式来注册映射了,于是把这句代码用如下内容替换:

ModelMapper mapper = new ModelMapper();

mapper.AddMapping<UserMap>();

HbmMapping mapping = mapper.CompileMappingFor(new[] { typeof(User) });

configure.AddDeserializedMapping(mapping,null);

现在,运行下代码,访问 /User/UserList,一切正常。

3,使用Attribute的方式配置实体映射。

如果觉得代码配置映射的方式还不够拉风,还有第三种方式,使用注解。

NHibernate本身并没有提供这种功能,是在contrib中实现的,项目地址:http://sourceforge.net/projects/nhcontrib/files/NHibernate.Mapping.Attributes/

使用之前需要先用NuGet或以下命令实现对NHibernate.Mapping.Attributes的引用: PM> Install-Package NHibernate.Mapping.Attributes

把UserMap类注释掉,然后给User类使用注解,代码如下:

[Class(Table = "NH_User")]

public class User

{

[Id(1, Name = "Id", TypeType = typeof(long), Column = "Id", UnsavedValue = "0")]

[Generator(2, Class = "native")]

public virtual long Id { get; set; }

[PropertyAttribute(Column = "Name", TypeType = typeof(string))]

public virtual string Name { get; set; }

}

Class和User.hbm.xml中的节点对应,同理,Id和Property及这两个注解的属性也都是和之前的xml文件对应的,效果也是同样的。因为NHibernate.Mapping.Attributes的原理就是通过反射生成xml文件流,然后添加到Configuration实例中。如果用惯了xml的方式配置映射,我们甚至可以把生成的xml流保存成xml文件来查看配置是否有问题。

对于Id的注解,第一个参数我传的是一个int类型的值,这个值是为了有多个注解时候,标明注解的顺序,即生成xml流的时候对应节点的先后顺序。

每个注解还有其他很多没涉及到的属性,但名称都非常直观,就不在此赘述了。

因为使用Attributes,向Configuration类注册映射的方式也得换一种,注释掉第2步中添加的Application_Start中的代码,然后添加下面这句代码:

configure.AddInputStream(HbmSerializer.Default.Serialize(Assembly.GetExecutingAssembly()));

因为实体就在当前的类中,所以调用HbmSerializer.Default.Serialize方法,把当前的程序集序列化到内存中,并把内存流通过AddInputStream添加到configure实例中。

此时,运行代码,浏览器访问,一切正常。

使用NHibernate(3)-- 用代码代替配置文件的更多相关文章

  1. Asp.net使用代码修改配置文件的节点值

    使用代码修改配置文件的方法: 1.打开配置文件写入的权限 2.先按节点名称长到要修改的节点,然后删除,紧接着将有新值的节点添加回去 3.关闭配置文件写入的权限 修改Appsetting节点的值,修改其 ...

  2. WCF学习之三, 寄宿方式 代码,配置文件

    可以通过代码或者配置文件寄宿WCF服务,在使用过程中的一些心得,记录一下,方便后续查阅. 预备知识,几个地址的作用 1. behavior.HttpGetUrl  定义元数据的地址,如果不定义基地址, ...

  3. MyBatis Generator作为maven插件自动生成增删改查代码及配置文件例子

    什么是MyBatis Generator MyBatis Generator (MBG) 是一个Mybatis的代码生成器,可以自动生成一些简单的CRUD(插入,查询,更新,删除)操作代码,model ...

  4. WinForm下的Nhibernate+Spring.Net的框架配置文件

    1.先将配置文件放到如下:<?xml version="1.0" encoding="utf-8"?> <configuration> ...

  5. 通过代码或者配置文件 对log4net进行配置

    1.通过代码进行配置 1.1代码 http://stackoverflow.com/questions/16336917/can-you-configure-log4net-in-code-inste ...

  6. java 连接接数据库 中的代码 放到配置文件中

    1.DButil.java package com.jobproject.util; import java.sql.Connection;import java.sql.DriverManager; ...

  7. JavaScript开发中常用的代码规范配置文件

    一.jsconfig.json { compilerOptions: { target: 'es6', experimentalDecorators: true, allowSyntheticDefa ...

  8. 关于NHibernate的一些代码

    SessionManager using System; using System.IO; using System.Runtime.Serialization; using System.Runti ...

  9. Google代码风格配置文件(Java)(IDEA/Eclipse)

    官网:http://www.cnblogs.com/EasonJim/p/7837474.html 下载: 安装: IDEA/Eclipse导入相应文件即可. 说明: Google代码风格文件的缩进是 ...

随机推荐

  1. NHibernate系列文章十四:NHibernate事务

    摘要 NHibernate实现事务机制非常简单,调用ISession.BeginTransaction()开启一个事务对象ITransaction,使用ITransaction.Commit()提交事 ...

  2. position:absolute和float会隐式的改变display类型

    position:absolute和float会隐式的改变display类型,不论之前是什么类型的元素(display:none除外),只要设置了position:absolute或float,都会让 ...

  3. makefile多目录的.c 格式.cpp混合编译

    # # c.cpp混合编译的makefile模板 # # BIN = test.exe CC = gcc CPP = g++ #这里只加入库头文件路径及库路径 INCS = -I"c:/mi ...

  4. linux 实用知识整理

    http://www.apelearn.com/study_v2/ 查看端口占用 netstat -apn

  5. Linux网络编程-SIGPIPE信号导致的程序退出问题

    当客户端close关闭连接时,若server端接着发送数据,根据TCP协议的规定,server端会收到RST响应,当server端再次往客户端发送数据时,系统会发出一个SIGPIPE信号给server ...

  6. nvidia 各种卡

    cudnn是针对maxwell优化的啊, maxwell下的各种卡都是游戏卡,具体可以见: https://developer.nvidia.com/maxwell-compute-architect ...

  7. SpringMVC在传递date型数据时的配置

    查阅了好多资料, 最后才发现原来只是添加一个方法就能解决的问题, 但是看了半天又没看明白, 只是知道这么写就能成功, 先记下来, 以后再研究吧, 在配置好springMVC的时候, 可以在前台的for ...

  8. delphi 10.1 berlin最新的开发框架:咏南中间件+咏南开发框架,购买后提供全部的源码

    咏南中间件+咏南开发框架支持最新的delphi 10.1(berlin),老用户提供免费升级. 购买提供:中间件源码 附带福利(赠送): CS开发框架源码BS开发框架源码移动APP源码中间件集群源码二 ...

  9. UVALive 5009 Error Curves 三分

    //#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include& ...

  10. StringBuffer

    1.StringBuffer StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和String不同,所以StringBuffer在进行字符串 ...