使用NHibernate(3)-- 用代码代替配置文件
2014-04-08 15:46 FuzhePan 阅读(642) 评论(0) 编辑 收藏 举报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实例中。
此时,运行代码,浏览器访问,一切正常。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?