原文地址:Must Everything Be Virtual With NHibernate? 老赵在博文中 我对NHibernate的感受(2):何必到处都virtual 提到这篇文章,顺便翻译一下. 如果你使用过 NHibernate 2.0 或者以后的版本,毫无疑问你将会遇到过几次下面的异常: NHibernate.InvalidProxyTypeException: The following types may not be used as proxies: NHibernateEx…
如果你曾经用过NHibernate 2.0或者更高的版本,那您一定碰到过下面的错误:NHibernate.InvalidProxyTypeException: The following types may not be used as proxies: NHibernateExamples.Entities.OrderLine: method get_UnitPrice should be 'public/protected virtual' or 'protected internal vi…
在 NHibernate 中使用字符串类型,默认会映射到字符类型,在 SQLServer 中,NVARCHAR 类型最大长度是 4000 字符,如果超过 4000,比如使用 SQL Server 中的 nvarchar(max),那么就需要特别配置. 比如说,我们在实体中定义了一个名为 Content 的字段. public virtual string Content { set; get; } 默认情况下,对应的数据库字段定义会自动生成为 Content ) null 如果我们希望它的长度是…
本节内容 什么是并发控制? 悲观并发控制(Pessimistic Concurrency) 乐观并发控制(Optimistic Concurrency) NHibernate支持乐观并发控制 实例分析 结语 什么是并发控制? 当许多人试图同时修改数据库中的数据时,必须实现一个控制系统,使一个人所做的修改不会对他人所做的修改产生负面影响.这称为并发控制. 简单的理解就是2个或多个用者同时编辑相同的数据.这里的用者可能是:实际用户.不同服务.不同的代码段(使用多线程),及其在断开式和连接式情况下可能…
本节内容 什么是并发控制? 悲观并发控制(Pessimistic Concurrency) 乐观并发控制(Optimistic Concurrency) NHibernate支持乐观并发控制 实例分析 结语 什么是并发控制? 当很多人试图同一时候改动数据库中的数据时,必须实现一个控制系统,使一个人所做的改动不会对他人所做的改动产生负面影响. 这称为并发控制. 简单的理解就是2个或多个用者同一时候编辑同样的数据. 这里的用者可能是:实际用户.不同服务.不同的代码段(使用多线程),及其在断开式和连接…
本节内容 引入 1.持久化类 2.映射文件 3.測试 结语 引入 在数据库操作中,我们除了对表操作,还有视图.存储过程等操作,这一篇和下篇来学习这些内容.这篇我们来学习怎样在NHibernate中使用视图.首先,我们在数据库中建立一个名为viewCustomer视图.选中CustomerId.Firstname.Lastname.OrderId.OrderDate项. 以下我们依次为这个视图编写持久化类和映射吧. 1.持久化类 同持久化数据库中的表类似,我们须要对视图持久化,定义视图中的每一个属…
关于datetime类型使用:  Oracle:  "and tb.EffectiveDate >= to_date(?,'yyyy-mm')" Sql:  "and tb.EffectiveDate >= Date(?,'yyyy-mm-dd')" Postgre: "and tb.EffectiveDate >= date(?)" 在Nhibernate中查询SqlServer ISQLQuery sqlQuery = Se…
今天下午有人在QQ群上问在NHibernate上如何根据条件删除多条数据,于是我自己就写了些测试代码,并总结了一下NHibernate中删除数据的方式,做个备忘.不过不能保证囊括所有的方式,如果还有别的方式,请园友踊跃提出,我补充上去. 1. 使用Session.Delete(T t) 方法 使用这个方法,需要先从数据库中获取实体T或者直接new T(), 给Id赋值,然后才能调用 Session.Delete(T) A: var session = NHibernateSession.Curr…
2010-07-15 12:10 by 彭白洋, 322 阅读, 0 评论, 收藏, 编辑 NHibernate中 Many-To-One 中lazy="proxy" 延迟不起作用的原因是因为设置了 not-found="ignore" 花费了一上午事件 查遍了Google 在最后准备放弃的时候突然想到把其他属性去掉试试,果然去掉not-found后效果出现了 至于原因是什么也不明白,项目紧也没太深入研究NH. 哪位大侠知道怎么回事了,指点一下小弟啊!…
本节内容 事务概述 1.新建对象 [测试成功提交] [测试失败回滚] 2.删除对象 3.更新对象 4.保存更新对象 结语 上一篇我们介绍了NHibernate中的Insert, Update, Delete操作,这篇我们来看看NHibernate中的事务.你通过它可以提交或者回滚你的操作. 事务概述 1.NHibernate中的事务(Transactions) 简单描述:要求ISession使用事务:做一些操作:提交或者回滚事务. 写成代码就像这样: ITransaction tx = _ses…
今天下午有人在QQ群上问在NHibernate上如何根据条件删除多条数据,于是我自己就写了些测试代码,并总结了一下NHibernate中删除数据的方式,做个备忘.不过不能保证囊括所有的方式,如果还有别的方式,请园友踊跃提出,我补充上去. 1. 使用Session.Delete(T t) 方法 使用这个方法,需要先从数据库中获取实体T或者直接new T(), 给Id赋值,然后才能调用 Session.Delete(T) A: var session = NHibernateSession.Curr…
在NHibernate中使用memcache二级缓存 一.Windows下安装Memcache  1. 下载   http://jehiah.cz/projects/memcached-win32/    memcached 1.2.1 for Win32 binaries : 2. 解压 到 D:/memcached: 3. 安装   D:/memcached /memcached.exe -d install 4. 启动   D:/memcached /memcached.exe -d st…
多态和覆盖 多态是面向对象编程中最为重要的概念之一,而覆盖又是体现多态最重要的方面.对于像c#和java这样的面向对象编程的语言来说,实现了在编译时只检查接口是否具备,而不需关心最终的实现,即最终的实现方式是在运行时才会决定.这给强类型语言提供了强大的灵活性,请看下面的例子: using System; namespace study00 { class Person { public string Name { set; get; } public virtual void sayHello(…
本篇文章介绍的是NHibernate的各种API及其作用. 下图描述了NHibernate的API在分层架构中的作用,下面将进行详细说明. NHibernate的接口大致分为四类:1.  被应用程序调用进行基本数据操作(增.删.改.查)的接口.这些接口是应用程序的业务逻辑层和控制层与NHibernate的主要交互点.ISession, ITransaction, IQuery和ICriteria属于此类.2. 被应用程序用来配置NHibernate的接口.Configuration就属此类.3.…
NHibernate中Session是线程不安全的,而且每次数据库操作 请求创建Session时对性能有些影响.在Windows应用中可以通过 [ThreadStatic]特性很简单的就可以实现线程安全,而在Web中可以通过将Session与用于请求HttpContext绑定实现线程安全,并且用户当前请求时只有一个Session.代码如下: ISessionManage.cs using System;using NHibernate; namespace Commercial.Jwsoft.F…
容易混淆是必须的,都是与继承有关系,并且涉及到override的使用 一.Virtual方法(虚方法) virtual 关键字用于在基类中修饰方法.virtual的使用会有两种情况: 情况1:在基类中定义了virtual方法,但在派生类中没有重写该虚方法.那么在对派生类实例的调用中,该虚方法使用的是基类定义的方法. 情况2:在基类中定义了virtual方法,然后在派生类中使用override重写该方法.那么在对派生类实例的调用中,该虚方法使用的是派生重写的方法. 二.Abstract方法(抽象方…
在有些时候,可能需要直接执行SQL语句.存储过程等,但nhibernate并没有提供一种让我们执行SQL语句的方法,不过可以通过一些间接的方法来实现. 下面给出一个在nhibernate中执行SQL语句的方法ExecuteSQL. public IList ExecuteSQL( string query ) { IList result = new ArrayList(); ISessionFactoryImplementor s = (ISessionFactoryImplementor)c…
在 nhibernate,如果将实体的一个关联属性配置为 lazy="no-proxy",那么,从其他属性计算出来的属性不能正确更新.例如,将以下代码中 Foo.Bar 配置为 lazy="no-proxy" ,属性 c 不能正确持久化. public class Foo { public virtual Bar Bar { get; set; } public virtual int a { get; set; } public virtual int b { g…
今天在做一个小项目时,用到了NHibernate,使用了模糊查询(Like),在后台用IQueryable去接收Session.Query<T>()的查询结果. 代码如下: /// <summary> /// 获取所有记录 /// </summary> /// <returns></returns> public virtual IQueryable<T> LoadAll() { var result = Session.Query&…
一个比较简单的查询代码如下:   IList userList=session.Find (" from testMSSql.student as student where student.Name=?","张三", NHibernate.NHibernate.String);   上面的代码,表示从testMSSql.student对象表中查询姓名为 "张三"的学生. 如果涉及到多对象间的连接查询,代码如下:   IList userList…
首页,在web.config中加入以下配置: <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> </configSections> <!--log4net 配置--> <log4net debug=&q…
一.Abstract: abstract方法必须在abstarct类中声明,没有默认实现,子类必须实现. 二.Virtual: virtual方法可以声明在abstract类中,也可以声明在非abstarct类中,并且可以有默认实现. 三.Interface(接口) 接口的一些描述 1. 接口是一个引用类型,通过接口可以实现多重继承.2. C#中接口不能有new.public.protected.internal.private等修饰符.3. 接口中只能声明"抽象"成员(所以不能直接下…
缓存的范围? 1.事务范围 事务范围的缓存只能被当前事务访问,每个事务都有各自的缓存,缓存内的数据通常采用相互关联的对象形式.缓存的生命周期依赖于事务的生命周期,只有当事务结束时,缓存的生命周期才会结束.事务范围的缓存使用内存作为存储介质,一级缓存就属于事务范围. 2.应用范围 应用程序的缓存可以被应用范围内的所有事务共享访问.缓存的生命周期依赖于应用的生命周期,只有当应用结束时,缓存的生命周期才会结束.应用范围的缓存可以使用内存或硬盘作为存储介质,二级缓存就属于应用范围. 3.集群范围 在集群…
以下属于不明来源资料: 引入 在程序运行过程中使用对象的方式对数据库进行操作,这必然会产生一系列的持久化类的实例对象.这些对象可能是刚刚创建并准备存储的,也可能是从数据库中查询的,为了区分这些对象,根据对象和当前会话的关联状态,我们可以把对象分为三种: 瞬时对象:对象刚刚建立.该对象在数据库中没有记录,也不在ISession缓存中.如果该对象是自动生成主键,则该对象的对象标识符为空. 持久化对象:对象已经通过NHibernate进行了持久化,数据库中已经存在对应的记录.如果该对象是自动生成主键,…
在使用NHibernate的时候.在Session中会有3种状态. 1. 瞬时状态 (Transient) 由 new 命令开辟内存空间的对象,也就是平时所熟悉的普通对象. 如: Student stu = new Student(); 瞬时对象特点:(1) 不和 Session 实例关联, 也就是说.在Session中没有缓存指向这个对象地址的引用: (2) 在数据库中没有和瞬时对象关联的记录.也就是说.这个对象的主键属性,在数据库中没有哪一行的主键与其相应. 2. 持久状态 (Persist…
NHibernate是从Hibernate移植过来的基于NET平台的一个ORM框架,同时跟这框架一起的还有一个开源库,叫做Iesi.Collections,这个库扩展了NET平台下面的几个集合,所谓集合,最重要的就是集合的语言,我们NET平台中可能IList,IDictionary用的比较多,但是其实还有像Set,Bag等等的存在,像在Python中,就有List列表跟Set集合的存在. 那么在用NHibernate进行开发的时候我们还如何来进行选择呢? 首先我们需要明确的是我们要知道这几个东西…
前两天刚开始学习NHibernate架构,照着前辈的例子打了一遍运行之后没问题,然后自己创建了一个User的Model发现一运行就报User附近有错误,然后就检查,类写的没错用了virtual,User.hbm.xml完全仿照之前写的那个例子,但是就是报错,然后就东改西改的花了大概有1个小时左右,然后就突发奇想,会不会是User这个类的名称有问题,一改,成功了!但是还是不太明白问什么不能添加User类.这里记一下,学完之后再来看看是怎么回事…
简单介绍虚函数virtual 在某基类中声明 virtual 并在一个或多个派生类中被重新定义的成员函数称为虚函数. 虚函数的作用就是实现多态性(Polymorphism),多态性是将接口与实现进行分离. C#作为完全面向对象语言,所有函数并不默认为virtual,但可以在基类中声明关键字virtual,就可以在其派生类中通过关键字override重写该函数.重写后的virtual函数依旧是virtual函数.由于virtual只对类中的实例函数成员有意义,所以成员字段和静态函数都不能声明为vi…
今天的工作中遇到一个奇怪的问题,如下: "a different object with the same identifier value was already associated with the session: 19519146" 该异常的上下文如下: 1:在net.tcp绑定的wcf远程调用时产生: 2:通过UI调用方法不会产生该异常. 分析该问题: 由异常信息可以看出,该问题是由于在session.update对一组实体进行更新后,试图将新的实体associate到se…
说明: 使用原生SQL查询时,若要通过addEntity方法引入对象,则查询结果列中必须包含该对象的所有属性,否则会抛出System.IndexOutOfRangeException异常. 结论: 若要使用原生的SQL,建议直接用SQL的方式写语句,不要用addEntity引入对象! http://blog.163.com/it_yinliqing/blog/static/78497271201111253443113/ 涉及的表:Cake{Id ,CakeName } CakeSize{ Ca…