华丽的NHibernate
http://www.cnblogs.com/kissdodog/archive/2013/02/21/2919886.html
华丽的NHibernate
摘要: 在NHibernate中,ISessionFactory是线程安全的,对应一个数据库。它是生成ISession的工厂。而ISession是线程不安全的。 创建一个ISessionFactory需要消耗比较多的资源。因此,我们只在程序初始化的时候创建一次,以后就一直使用这个ISessionFactory。 而ISession的创建只消耗很少的资源。因此我们可以随意创建。一、原始单例模式封装的ISessionFactory 因此,对于ISessionFactory,我们使用饿汉单例模式实现它。 原始饿汉单例模式封装ISessionFactory实例: //密封类 ...阅读全文
摘要: 首先,当然是安装MemCache服务器端了。 然后配置过程,仅仅两个问题。 1、NHibernate要与NHibernate.Cache的版本要一致。否则,NHibernate.Caches.MemCache.MemCacheProvider无法实例化。 2、要引用log4net,否则Memcached.ClientLibrary.SockIOPool无法实例化。 App.config: NHibernate.Dialect.MsSql2008Dialect NHibernate.Connection....阅读全文
摘要: 在NHibernate的映射中,关于继承的映射策略有3种方式单表继承类表继承具体表继承 另外还有一种比较特别的多态映射隐式多态 下面分别来阐述NHibernate继承映射的各种策略要点。一、单表继承 单表继承的方式是,所有的字段都放在一个表中,用一个字段来区分子类。使用配置节点配置子类。 看DEMO,首先新建一张Animal表如下: 映射文件:Animal.hbm.xml: //discriminator-value用来标记表中哪些行是青蛙 映射文件:Fish.hbm.xml ...阅读全文
摘要: NHibernate过滤器相当于定义一个非常类似于类和集合上使用的where子句。ISession 中默认是不启用过滤器的,必须通过ISession.EnableFilter()方法显式的启用。 该方法返回被启用的IFilter的实例。这也支持链式操作。 过滤器主要的配置都在映射文件内完成。来看示例: 操作: static void Main(string[] args) { ISessionFactory _sessionFactory =...阅读全文
摘要: NHibernate也是能够操作存储过程的,不过第一次配置可能会碰到很多错误。一、删除 首先,我们新建一个存储过程如下: CREATE PROC DeletePerson @Id int AS DELETE FROM Person WHERE PersonId = @Id; 修改映射文件,添加删除对象的存储过程: DeletePerson ? 执行存代码: using (ISession session = sessionFactory.Op...阅读全文
摘要: 在NHibernate中,可以把视图当表一样操作,只需要记住一点就是,视图是只读的,因此映射实体的setter应该改为protected。 新建一个视图如下: 持久化类: public class CountryPersonModel { public virtual int PersonId { get; protected set; } public virtual string PersonName { get; protected set; } public virtual string CountryName { ge...阅读全文
摘要: 在上一篇的Linq to NHibernate的介绍当中,全部是namespace NHibernate命名空间中的IQueryOver接口提供的。IQueryOver这个借口实际上会被翻译成条件查询(Criteria Queries)。 实际上Linq to NHibernate更加强大。我...阅读全文
摘要: 数据操作,在这里主要介绍INSERT、UPDATE、DELETE。我们在使用NHibernate的时候,如果只是查询数据,不需要改变数据库的值,那么是不需要提交或者回滚到数据库的。一、INSERT 通过调用ISession.Save()方法,然后同步同步到数据库。 Program.cs ...阅读全文
摘要: NHibernate的一级缓存,名词好像很牛B,很难。实际上就是ISession缓存。存储在ISession的运行周期内。而二级缓存则存储在ISessionFactory内。一、ISession一级缓存测试 ISession默认开启一级缓存,不需要任何配置。ISession缓存在ISession创建后就可以使用,以后每次通过此ISession操作数据时,ISession会检测自身是否缓存有相应的数据,如果有则直接返回。如果没有,这时才查询数据库返回,同时缓存到ISession。当释放ISession实例的时候,缓存自动销毁。 示例: 首先我们先开启配置文件中的show_sql节点: ...阅读全文
摘要: 一、持久化类中成员标量的要求 作为被NHibernate使用的持久化类,必须满足以下几点要求: 1、声明读写属性 在NHibernate的使用中,持久化类的成员变量必须声明对应的属性,NHibernate支持public、internal、protected三种访问修饰符。 2、提供标识属性 持久化类必须提供一个标识属性,标识属性对应数据库的主键。 当然这个是可选的,并非强制性,但是强烈建议这么做。这个标识属性可以叫任何名字,任何类型。 3、属性必须是非密封的和虚的 持久化类中所有的属性,必须声明为非密封的,也就是不能带有sealed。而且必须带有virtual...阅读全文
摘要: 使用NHibernate最重要的一步就是配置,如果连NHibernate都还没有跑的起来,谈何学习。今天就来详解一下NHibernate的配置。一、NHibernate基本配置 NHibernate配置要注意的有: 1、NHibernate需要一个自定义的配置节点,一般放在Web.confi...阅读全文
摘要: 映射文件,用于告诉NHibernate数据库里的表、列于.Net程序中的类的关系。因此映射文件的配置非常重要。一、一对一 NHibernate一对一关系的配置方式使用配置节点。 当我们两个表拥有相同的主键字段,主键值相同的需要关联在一起。比较典型的一个例子是,一个对象的属性太多,常用的和不常...阅读全文
摘要: 一、集合外键 在NHibernate中,典型的用于映射集合类的元素有,,,,,。 我们回到上一篇,集合映射基础当中的一对多查询。对于集合类型: public virtual ISet ListPerson { get; set; } NHibernate的配置文件与之对应的是: 那么、、、、、这些东西的用法以及它们之间的区别是什么呢? 1. ISet集合中的对象是唯一的,无序的,不能通过索引、key值访问。 在.Net中并没有与对应的类。因此当我们的配置文件是配置集合关系的时候,Model持久化类中ISet必须使用NHibernate的...阅读全文
摘要: 刚学NHibernate的时候觉得,HQL挺好用的,但是终归没有与其他技术相关联,只有NHibernate用到,一来容易忘记,二来没有智能提示,排除错误什么的都不给力,直到看到一个同事用Linq to NHibernate,那代码是相当的清晰明了,其实什么条件查询,HQL什么的感觉只是一个NHi...阅读全文
摘要: NHibernate完全靠配置文件获取其所需的一切信息,其中映射文件,是其获取数据库与C#程序关系的所有信息来源。一、简单映射 下面先来一个简单的例子,然后随着不断地对这个例子修修改改,从而真正了解映射文件。具体的资料可以查看http://www.cnblogs.com/kissdodog/archive/2013/02/21/2919886.html 先来看一张表: 映射文件Product.hbm.xml: PersonModel.cs:namespace Model{ public class...阅读全文
摘要: 一、组件简介 组件(Component)可以理解为被一个对象所包含的对象而持久化,而并非一个实体。简单说来,假如数据库有FirstName,LastName这两个字段,我们在C#中可以将这两个字段提取出来作为一个Name对象使用。 示例,首先建一张表,并添加数据如下: Person.hbm.xml Model:namespace Model{ public class PersonModel { public virtual int Id { get; set;...阅读全文
摘要: 一、延迟加载 延迟加载可以理解为:当需要用的时候才加载。 假设我们数据库有一个Person对象,一个Country对象,其中Person属于Country,一对多关系。当我们Get()一个Person对象的时候。并不立即把Country对象也加入来,而是当我们的代码执行到要通过Person调用Country对象的时候,NHibernate才到数据库去查询对应的Country对象,这就叫延迟加载。相反,如果我们Get()一个Person对象,并且连与此Person对象相关联的Country对象也一起加载到程序中,这就叫立即加载。 延迟加载必须在Session的周期内,如果查询了数据,但是程...阅读全文
摘要: 1.hibernate-mapping 这个元素包括以下可选的属性。schema属性,指明了这个映射所引用的表所在的schema名称。假若指定了这个属性, 表名会加上所指定的schema的名字扩展为全限定名。假若没有指定,表名就不会使用全限定名。default-cascade 指定了未明确注明cascade属性的.Net属性和集合类.Net会采取什么样的默认级联风格。 auto-import属性默认让我们在查询语言中可以使用非全限定名的类名。assembly和 namespace指定了持久化类的应用程序集名称和其所在的名称空间名。 各选项说明:(1)schema (...阅读全文
摘要: 一、NHibernate配置所支持的属性属性名用途dialect设置NHibernate的Dialect类名 - 允许NHibernate针对特定的关系数据库生成优化的SQL可用值:full.classname.of.Dialect, assemblydefault_schema在生成的SQL中, 将给定的schema/tablespace附加于非全限定名的表名上.可用值:SCHEMA_NAMEuse_outer_join允许外连接抓取,已弃用,请使用max_fetch_depth。可用值:true|falsemax_fetch_depth为单向关联(一对一, 多对一)的外连接抓取(outer阅读全文
摘要: 一、NHibernate二级缓存简介 NHibernate由ISessionFactory创建,可以被所有的ISession共享。 注意NHibernate查找缓存的顺序,在使用ISession操作数据时,NHibernate会先从一级缓存中查找需要的数据,如果一级缓存不存在需要的数据,则查找二级缓存,如果二级缓存存在所需数据,则直接使用缓存中的数据。如果二级缓存都没有,那么才执行SQL语句,从数据库中查找缓存。 NHibernate本身提供了一个基于Hashtable的HashtableCache缓存,不过功能有限且性能不高。不适合用于大型应用程序,不过我们可以使用第三方缓存提供程...阅读全文