一个ADO.NET连接的封装,用来提供ITransaction的工厂。提供了一个通过主键检索对象和导航链接查询对象时的一级缓存。也就是EF Core中的导航属性。...Transient Objects and Collections(临时对象和集合): 表示临时的未被ISession托管的持久化对象,它们被应用层临时创建但直到ISession关闭都不会被持久化。...实例状态 在NHibernate中,一个可持久化的对象有三种不同的状态,依据与持久化上下文之间的关系不同,其中ISession就是一个持久化上下文。...状态分为以下三种: transient 暂存的、临时的 该状态的对象并没有被持久化上下文捕获到,简单来讲就是刚被创建,还没有从数据库/持久化上下文中获取到主键信息。...其中create表示每次只创建新增的;create-drop表示每次ISessionFactory创建时创建表 ,ISessionFactory关闭时,删除表;其中update表示每次都会将DDL SQL
/// public int Count() { #region 方法一...(); //return count; #endregion #region 方法二 ISession...public void Delete(int userId) { ISession session = GetSession(); //在NHibernate...(类似于在Access中使用参数化SQL语句的方式,给参数赋值要按照参数出现的顺序来)等几种方式 IQuery query = session.CreateQuery("delete...from UserInfo where UserId=:UserId"); //如果采用":"+参数名方式使用参数,那么给参数赋值时不需要在参数名前加":"号,如query.SetInt32
1.2.1 id 任何一个映射都必须声明一个数据表的主键,大多数类也必须有一个唯一标示字段用来区分不同的实例。..." type="typename" /> name :类里的属性名 column:对应数据表的列名 type:数据库中的类型 1.2.3 many-to-one 在Nhibernate...首先,创建一个泛型模板类,并约束泛型为类: public class Repository where T: class { } 添加一个ISession属性,用来后续访问操作,并由构造方法赋值...: public IQueryable IqQueryable() { return Session.Query(); } 其中 IQueryable是一个接口,表示这是一个可查询对象...UPDATE NOWAIT PostgreSQL 8.2 NHibernate.Dialect.PostgreSQL82Dialect 在DROP TABLE和DROP SEQUENCE 语句中支持
NHibernate不仅仅管理.NET 类到数据库表的映射(包括.NET 数据类型到SQL 数据类型的映射),还提供数据查询和获取数据的方法,大幅度减少我们开发时人工使用SQL和ADO.NET处理数据的时间...首先,我们要从ISessionFactory中获取一个ISession(NHibernate的工作单元)。ISessionFactory可以创建并打开新的Session。...我们可以使用GoF23中的单例(Singleton)模式在程序中创建ISessionFactory。...这个实例我编写了一个辅助类NHibernateHelper 用于创建ISessionFactory并配置ISessionFactory和打开一个新的Session单线程的方法,之后在每个数据操作类可以使用这个辅助类创建...我们可以在People.hbm.xml点击右键选择属性修改该文件的生成操作 (5) NHData.cs对库表People进行增删改查 现在完事具备只欠东风了,开始我们的数据库CRUD操作,在看该文件的代码时
其中:李永京的博客http://www.cnblogs.com/lyj/tag/NHibernate/ 内容最为丰富。而且在李哥的博客里面学了很多东西,在此致谢! ...第一个问题: 要明白Nhibernate是什么,就要首先明白什么是ORM。 ...看下面代码: User myUser = new User(); //User初始化........ session.Save(myUser);//保存一个用户 session.Update(myUser...告诉你吧,session是我们只需要一个配置文件就可以随处调用了。这么神奇? Nhibernate带给我们的就是:对于开发者通常的数据持久化相关的编程任务,解放其中的95%!...先看项目整体图,作为初学的demo 没有层次,没有优化,只是作为入门的一个简单介绍! 第一步:设计数据库中的表。建立一个User表。
所以我就用了一个最蛮最笨的方法:我自己做一个系统,严格按照我自己对于这些概念的理解进行开发,看最后这条路能不能走出来?历经五年甚至更多时间的摸索和实践,我觉得我基本上是走出来了。...然后,可以通过NHibernate的session,调用 session.Save(), session.Delete(), session.Load()和session.Query()等方法将对象存储.../// 为什么是NHibernate? /// 1、我的项目开始得比较早,好几年前了,应该是。...我们“增”和“删”直接利用了NHibernate的session机制,只是把“查(select)”给单独抽象了出来,也单独的抽象成一个名为Query的project。...都搅在一起,真不知道该放在哪里说 为什么不使用Repository模式而采用Query ViewMode的Map:使用Automapper 单元测试:Query又要搅到数据库,唉……
NHibernate 多对多映射的数据更新 最近在用 NHibernate 做多对多更新时突然发现 NHibernate 更新的策略很差, 对多对多关系的更新居然是先全部删除再插入全部数据, 感觉非常奇怪...session.Update(user); session.Flush(); } 上面的代码是将用户的第一个角色删除, 再添加一个新的角色, NHibernate 生成的 SQL 语句如下(仅包含对关系表...Int32 (0)] 居然是先将属于该用户的全部角色删除, 再添加一份新的进来, 完全无法接受, 反过来思考觉得肯定是自己的问题, 经过一番搜索 (Google), 发现 StackOverflow 上也有人问类似的问题..., 并且最终在 NHibernate Tip: Use set for many-to-many associations 发现了解决方案, 将多对多的映射的 bag 改为用 set , 问题终于得到了解决...sess.Flush(); 由此可见, bag 在多对多映射更新时性能较差, 如果不需要更新,则可以放心使用, 在需要更新时则 set 是更好的选择。
一、NHibernate简介 在今日的企业环境中,把面向对象的软件和关系数据库一起使用可能是相当麻烦、浪费时间的。NHibernate是一个面向.Net环境的对象/关系数据库映射工具。...NHibernate除了能将一张表映射为一个对象,还可以将表间关系变为对象的属性。例如学生和课程间的多对多关系就可以转化为学生类中的一个课程集合的属性。...由此可见,NHibernate不仅仅管理.Net类到数据库表的映射,还提供数据查询和获取数据的方法。因此采用NHibernate,可以大幅度减少开发时人工使用SQL处理数据的时间。...二、NHibernate使用步骤 1.为系统引入NHibernate的库,并且配置NHibernate; 2.新建一个将要持久化.Net对象的表; 3.构建一个需要被持久化的.Net类; 4.构建一个可以让...创建一个用于测试的表 这里需要创建3张表,分别用于保存:学生、课程、选课信息。可以用Sql语句来创建,也可以用其他方式创建。
一级缓存 一级缓存就是 ISession 缓存, 在 ISession 的生命周期内可用, 多个 ISession 之间不能共享缓存的对象, 通过 ISessionFactory 创建的 ISession...Get 方法加载实体类时, 有 sql 输出, 从数据库取出了数据, 第二次加载则没有 sql 数据, 也就是利用了 session 的一级缓存。...[CategoryID]=@p0; @p0 = 1 [Type: Int32 (0)] After Get Category 从输出可以看到, 调用 Get 方法之后, Nh 立刻从数据库加载实例...[CategoryID]=@p0; @p0 = 1 [Type: Int32 (0)] 1, Beverages 可以看出, 调用完 Load 方法之后, nh 并没有立即从数据库加载实体, 而是等到读取实体类属性时...二级缓存 二级缓存是 SessionFactory 级别的缓存, 也就是数据库级别的缓存, 可以被同一个 SessionFactory 创建的所有 session 共享。
在 .NET Core 应用中使用 NHibernate NHibernate 最近发布了 5.1.3 版本, 支持 .NET Standard 2.0 , 这意味着可以在 .NET Core 2.0...1、 新建一个基于 .NET Core 的 Web API应用, 命令如下: mkir WebApiTest cd WebApiTest/ dotnet new webapi 2、 添加 NHibernate...Include="NpgSql" Version="4.0.2" /> 3、 在项目中新建一个 Models 目录, 并创建实体类以及对应的 xml 映射文件, 代码如下.../*.hbm.xml" /> 5、 创建 NHibernate 的配置文件,...的日志组件 factory.UseAsHibernateLoggerFactory(); } 6.3、 修改 ConfigureServices 方法, 添加 NHibernate 相关的服务
数据訪问层,页面层,数据模型层以及一个公共类的部分,每层我们在这个基础上抽象了相应的接口,这样上一层仅仅须要对下一层,面向接口编程。同一时候有Spring.NET来管理层之间的关系。...一个抽象类实现增删改查的同一时候又添加了子类的自身扩展性....(单表查询) /// /// 通过一个条件查询(单表查询) /// /// 一个是ICaseAssignEntityRepository自己的业务逻辑接口(实现了子类的拓展,比方在某个类中想要加入这个类特有的方法。仅仅须要在自己的接口中填写就可以)。...通过这个继承体系保证了我们在实现增删改查的同一时候外放一个接口保证扩展性.
(select,insert,update,delete),也可以通过xml文件的配置作自定义的查询,或是调用存储过程。...当然还有很多NHibernate的开发框架大家可以在www.codeproject.com,www.codeplex.com上找到。...然后再去创建数据库表,和UI的部分; 我还是按在有数据表的情况下如何用NHibernate作开发 1.用MyGeneration创建实体类和mapping文件选择NHibernate lujan99 1.06...这个模 块他提供可以方便实现1-n,n-1,n-n的mapping非常方便使用 2.在项目中加载这些创建好的文件建议加载到一个新的项目比如BusinessModule。...另外如果需要对业务逻辑的抽象操作在这里扩展它的方法。 开发一个AbstractRepository实现IRepository这个接口的CRUD操作。
准备工作: 需要使用.NET Framework 2.0或上以版本的框架,准备NHibernate框架,本文使用3.3版,到目前NHibernate都还是基于.net framework 2.0,官方下载地址...开始做一个简单的增删改查示例,如图1示例: 图1 1、创建数据库与表,这里假设使用NibernateDemo数据库,Users表包括(id,name,pwd)字段,id是主键自动增长,name与pwd...3、编写实体类(POCO,Plain Old CLR Objects),映射文件包含POCO类映射到一个或者多个数据库表的元数据信息。User.cs文件如下所示。...NHibernate通过对Configuration().Configure()的调用来装载配置文件,并初始化成一个Configuration实例,一般ISessionFactory通常只是被初始化一次...UserDAL中的方法。
NHibernate版本是 5.2.7 2.2 配置 需要创建一个项目用的配置文件:App.config...." type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate"/> 这段代码的含义是,在config...在App.config文件configuration结点中添加以下代码: nhibernate-configuration-2.2...sessionFactory用来创建一个访问数据库的Session 2.4 增删改查 先来个简单的示例类: public class Cat { public virtual string Id...查询并修改: var cats = session.Query().ToList(); var cat = cats.First(); cat.Name = "xiao li"; session.Update
---- 使用SQLiteOpenHelper类创建数据库与版本管理 对于涉及数据库的app,我们不可能手动地去给他创建数据库文件,所以需要在第一次启用app 的时候就创建好数据库表;而当我们的应用进行升级需要修改数据库表的结构时...(database):首次使用软件时生成数据库表 onUpgrade(database,oldVersion,newVersion):在数据库的版本发生变化时会被调用, 一般在软件升级时才需改变版本号,...my.db的文件,并且会执行onCreate()里的方法, 创建一个Person的表,他又两个字段,主键personId和name字段;接着如我我们修改db的版本 号,那么下次启动就会调用onUpgrade...流程小结: Step 1:自定义一个类继承SQLiteOpenHelper类 Step 2:在该类的构造方法的super中设置好要创建的数据库名,版本号 重写onCreate( )方法创建表结构 重写onUpgrade...( )方法定义版本号发生改变后执行的操作(如不需要,故此方法为空) ---- 如何查看我们生成的db文件 当我们调用上面的MyDBOpenhelper的对象的getWritableDatabase()就会在下述目录下创建我们的
解决这个问题的方法是始终指定确定性的排序顺序,以便主查询始终返回相同的行集合。这通常意味着你应该在表上的一个唯一列上使用Select.order_by()。...相反,一种典型的方法是,当首次调用基于 ORM 的方法和函数时,从最顶层调用函数的过程将处于一个块中,该块在一系列操作成功完成时提交事务,并且在任何原因失败时,包括失败的 flushes 时回滚事务。...如果flush()完全回滚逻辑事务,那么当我们到达except:块时,Session将处于干净状态,准备在全新事务上发出新的 SQL,并且调用Session.rollback()将不按顺序进行。...如果一个查询User()对象,多次在列表中获取相同对象实际上并没有太多意义。有序集合可能更好地表示Query 在返回完整对象时所寻求的内容。...如果flush()完全回滚逻辑事务,那么当我们到达except:块时,Session将处于干净状态,准备在全新的事务上发出新的 SQL,并且对Session.rollback()的调用将处于不正确的顺序
步骤1:创建数据库表 我们正在做的是一个非常简单的NH示例.在这个例子里面,我们实现一个基本的用户管理子系统.我们将会使用一个user表(sql server 2000): use NHibernate...步骤2:创建.Net类: 当我们这样一堆的用户的时候,我们需要某种对象来保存.NH是通过reflection对象的属性来工作的,所以我们给需要持久化的对象添加属性.一个对应于上面数据库结构的类可以写成这个样子...步骤3:编写映射文件(Mapping File) 现在我们有了数据库表和.Net类,我们还需要告诉NH怎样在数据库和类之间映射.这就需要映射文件了.最简捷(也是可维护性最好的)方法就是为每一个类编写一个映射文件...步骤4:创建数据库配置文件 目前为止,我们还没有告诉NH到哪儿去找数据库.最直接的方法就是在你程序的配置文件中给NH一个部分,就是这样: 在代码里面使用NHibernate是很简单的事情: 1. 创建一个Configuration对象. 2.
使用该INSERT操作的简单案例是保存一个 POJO。在这种情况下,表名由简单的类名(而不是完全限定的类名)确定。可以使用映射元数据覆盖存储对象的表。 插入或更新时,id必须设置该属性。...第二种方式是在@Table注解中指定表名。 批量插入、更新和删除单个对象 Cassandra 协议支持使用批处理在一个操作中插入一组行。...调用方法会创建新的不可变(中间)Update对象。 9.9.4.删除行的方法 您可以使用以下重载方法从数据库中删除对象: boolean 删除 (Query query, Class在 Java 中创建Query 和Criteria实例时使用静态导入以提高可读性。...Query一经创建即不可变。调用方法会创建新的不可变(中间)Query对象。