摘要:
1,inverse属性的作用:只有集合标记(set/map/list/array/bag)才有invers属性;以set为例,set的inverse属性决定是否把对set的改动反应到数据库中去,inverse=false(反应),inverse=true(不反应);默认值是false;one-to-... 阅读全文
随笔分类 - NHibernate
使用NHibernate(3)-- 用代码代替配置文件
2014-04-08 15:46 by FuzhePan, 642 阅读, 收藏, 编辑
摘要:
1,用代码配置Configure类。上一篇“让代码跑起来”中,是通过在Web.config配置来实现Configure类的,NHibernate还提供了代码的方式。把之前的配置都注释掉,然后修改Application_Start中创建SessionFactory的代码如下:var configure = new Configuration() .DataBaseIntegration(dbi => { dbi.Dialect(); dbi.Driver(); dbi.ConnectionProvider(); dbi.ConnectionStringName = "SqlSer 阅读全文
使用NHibernate(9)-- 缓存
2014-04-08 15:44 by FuzhePan, 869 阅读, 收藏, 编辑
摘要:
1,对象状态。作为基础,还是先看一下对象的状态吧。主要涉及到三个名词,瞬时、持久、托管。瞬时态:对象刚创建,Session还不知道这个对象的存在。可以通过调用ISession的Save等方法可以转变为持久态。持久态:对象刚通过ISession的Get或Load加载,如果对象被修改,则在操作提交时,会将修改同步到数据库中。托管态:程序中有这个对象,数据库中也有相应的记录,但该对象已经不被Session管理了。比如,通过ISession拿到一个对象后,管理了ISession,则刚才的对象出于托管态。处于托管态的对象可以被重新关联到某一个Session。2,一级缓存。NHibernate的缓存分为一 阅读全文
使用NHibernate(8)-- 延迟加载
2014-04-08 15:43 by FuzhePan, 338 阅读, 收藏, 编辑
摘要:
1,延迟加载。延迟加载,即用到的时候再加载数据。这种机制是非常有情怀的,比如一篇中的用户实体有标签、问题等导航属性,如果只是用到用户名去查询整个实体,则把相关的标签和问题也都加载,性能会比较低。而有了延迟加载机制之后就可以做到查询用户实体只加载用户数据,访问到标签或问题等属性的时候再去加载这些数据。如果使用Linq To NHibernate,则可以使用Linq提供的延迟加载机制,对于这种,是linq提供的机制,就不讨论了。需要注意的是,如果查询出用户实体之后,关闭了Session。则延迟加载的时候会抛出异常。这是因为关闭session数据库连接被关闭,无法继续查询数据。NHibernate默 阅读全文
使用NHibernate(7)-- 一对一 && 一对多 && 多对多
2014-04-08 15:42 by FuzhePan, 359 阅读, 收藏, 编辑
摘要:
1, 一对一。对于数据量比较大的时候,考虑查询的性能,肯能会把一个对象的属性分到两个表中存放;比如用户和用户资料,经常使用的一般是Id和用户名,用户资料(学校,籍贯等)是不经常被查询的,所以就会分成两个表。实体和映射如下:使用以下代码插入数据:public ActionResult InitData() { using (var session = MvcApplication.SessionFactory.OpenSession(new DebugInterceptor())) using (var transaction = session.BeginTransaction()) { tr 阅读全文
使用NHibernate(6)-- HQL && ICriteria 简单介绍
2014-04-08 15:40 by FuzhePan, 610 阅读, 收藏, 编辑
摘要:
1,HQL。HQL是NHibernate特有的查询方式,早先的java语法还没有类似Linq的Jinq,所以Hibernate就弄了一套自己的查询语言,NHibernate移植的时候把这种语言也一块儿移植过来了。这是一种和Sql差不多的语言,不同的是查询中的字段和实体名保持一致,而不是和数据库表列名保持一致。下面的例子还是在之前那个小程序的基础上演示:public User GetUserByName(string name){ var hql = @"select u from User u where u.Name=:name "; return session.Cre 阅读全文
使用NHibernate(5)-- Linq To NHibernate
2014-04-08 15:30 by FuzhePan, 417 阅读, 收藏, 编辑
摘要:
Linq是NHibernate所支持的查询语言之一,对于Linq的实现在源码的src/Linq目录下。以下是一个使用Linq进行查询数据的示例:var users = session.Query().where(n=>n.Id=5).OrderBy(n=>n.Name).ToList();session在我们跑起来的第一个程序的Controller中已经介绍过了,它是查询数据库的入口;通过调用其泛型方法Query,可以拿到相应的集合,然后通过where方法进行条件过滤,通过OrderBy进行排序;注意到此为止,NHibernate并没有去查询数据库,而是调用ToList的方法的时候 阅读全文
使用NHibernate(4)--拦截器和事件
2014-04-08 15:25 by FuzhePan, 675 阅读, 收藏, 编辑
摘要:
如果想在一个事务的开始、执行中、完成后等过程中执行一些自己的逻辑(比如记录日志、查看sql),拦截器(Interceptors)和事件(Event)就可以发挥作用了。两者所能完成的功能差不多。1,拦截器(Interceptors)要实现拦截器,则必须实现IInterceptor接口,这个接口在NHi... 阅读全文
使用NHibernate(2)-- 让程序跑起来
2014-04-08 15:23 by FuzhePan, 270 阅读, 收藏, 编辑
摘要:
1, 创建一个MVC的程序,NHibernateDemo,并用NuGet安装NHibernate。 安装引用后,NuGet会自动安装NHibernate所依赖的类库 Iesi.Collections 2,配置NHibernate。 首先在Web.config的configSections节点下添加如下配置,声明NHibernate的节点: 然后,添加数据库连接字符串的配置 最后,在configuration节点下添加NHibernate相关的配置: NHibernate.Dialect.MsSql2008Dialect NHibernate.Driver.Sql... 阅读全文
使用NHibernate(1)--资料汇总
2014-04-08 15:21 by FuzhePan, 204 阅读, 收藏, 编辑
摘要:
NHibernate最新版本是4.0,目前还只是alpha版,没有发布。稳定版本是3.3,项目中用的也是这个版本,所以以后的介绍都是基于这个版本的。在网上找了一下相关的学习资料,现汇总如下:NHibernate官网:http://nhforge.org/default.aspx文档:http://nhforge.org/doc/nh/en/index.htmlHibernate-memcached :https://github.com/raykrueger/hibernate-memcached两本书:《working whith nhibernate》http://it-ebooks.in 阅读全文
一次简单的ORM调研
2014-03-22 12:33 by FuzhePan, 529 阅读, 收藏, 编辑
摘要:
对于ORM,公司一直在用轻量级的PetaPoco,PetaPoco是挺轻巧,易用性和性能都非常优秀。但也有很多的缺点,在组装复杂sql语句的时候有bug,记忆中使用orderby、sum的时候经常会有问题;特殊情况下数据库链接有问题:具体问题记不清了,后来同事修改源代码解决了这个问题;本身不支持linq,不过github上有人提供了linq的支持;功能少,没有内置使用缓存,虽然公司自己实现了一套对Runtime和Memche的封装的框架,但并没有封装的很强大,写数据访问层的代码时,还是需要手工通过CacheKey操作缓存。 按照目前的应用场景,显然PetaPoco太轻了,相对于NH、EF... 阅读全文