首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

NHibernate Session.Flush()在未发生更新时发送更新查询

首先,我们需要了解NHibernate是一个用于.NET平台的对象关系映射(ORM)框架。Session.Flush()是一个NHibernate中的方法,用于将当前Session中的所有更改(如新增、修改或删除)同步到数据库中。

在某些情况下,如果Session.Flush()被调用,但是没有发生任何更新,那么NHibernate会发送一个空的SQL查询,这个查询不会对数据库产生任何影响。这种情况通常发生在Session.Flush()被手动调用,但是在调用之前没有发生任何更改的情况下。

为了避免这种情况,可以在调用Session.Flush()之前检查Session中是否有任何更改,可以通过调用Session.IsDirty()方法来实现。如果Session中没有任何更改,那么就不需要调用Session.Flush()方法。

总之,NHibernate Session.Flush()在未发生更新时发送更新查询是一个正常的行为,但是可以通过检查Session中是否有更改来避免不必要的查询。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

NHibernate总结

NHibernate不仅仅管理.NET 类到数据库表的映射(包括.NET 数据类型到SQL 数据类型的映射),还提供数据查询和获取数据的方法,大幅度减少我们开发时人工使用SQL和ADO.NET处理数据的时间...每个文件的详细代码在下面介绍 (2)     NH.Data层引用Nhibernate相关的DLL ?...我们可以该文件上点击右键选择属性进行修改。 (2)     NHibernateHelper.cs数据操作辅助类 我们现在可以开始NHibernate了。...我们可以People.hbm.xml点击右键选择属性修改该文件的生成操作 (5)     NHData.cs对库表People进行增删改查 现在完事具备只欠东风了,开始我们的数据库CRUD操作,在看该文件的代码...,建议大家先看一下http://www.cnblogs.com/lyj/archive/2008/10/15/1312089.html这篇博客,了解一下NHibernate查询语言(HQL)。

89440

Fluent NHibernate之旅(四)-- 关系(上)

经过了前面三篇的介绍,相信大家对Fluent NHibernate已经有一定的了解了,我们学习中,Fluent 也已经进入了RTM版本。...这次的版本发布离RC版只有半个月不到,修正了很多bug,同时补充了大量的功能,每天更新中,也看到了大量的单元测试,我们相信Fluent NHibernate 已经相对稳定成熟了。...我们后面的教程,会使用RTM版本来演示,希望大家能及时更新(点击下载最新版)。...Mapping 今天我们将说一下ORM中的R映射,我们现在的数据库大多都是关系型数据库了,所以可以说关系我们数据库设计中也是非常重要的部分,NHibernate也非常重视这一块,但在传统方式中,配置就比较麻烦...}; detail.User = user; user.Detail = detail; session.Save(user); session.Flush

1.2K60

C#——Nhibernate探索

但看到.xsd文件,第一间反应,他们应该是用来帮助开发者,快速生成配置文件用的。为了保险起见,我们上网查询一下。 查询结果: 查询结果是,他们俩是【文件智能提示功能】用的。...public void CreateCustomer(Test test) { Session.Save(test); Session.Flush...我推断,Nherbinate是读这个配置文件,然后到这个程序集里,反射查询那些poco对象。 最后,nhibernate-configuration-2.2这句话我想了很久要不要改成4.0。...结语 这是一场Nhibernate探索之旅,结果是非常顺利的配置成功了。共耗时2小。...为什么说是探索之旅呢,因为,我也是首次配置Nhibernate,我平常更多的是使用Entity Framework。 文中使用了一些推断,猜测的词语。那是因为,真的是推断的。

47230

Hibernate中 对象 的三种状态

Hibernate中,可以把实体对象看成3中状态,分别是:瞬时态(临时态)、持久态、脱管态(游离态)。...---- 临时态 转换 通过new创建的对象为瞬时态 通过delete方法操作的对象将转变为瞬时态 特征 瞬时态的对象可以被垃圾回收 瞬时态的对象未进行过持久化,与session关联 -...--- 持久态 转换 通过get 、load 、list 、iterate 方法查询到的对象为持久态 通过save 、update 方法操作的对象转变为持久态 特征 持久态对象垃圾回收器不能回收...持久态对象的数据可以自动更新到数据库中,时机是调用session.flush()执行。...而提交事务时会调用session.flush(),因此提交事务也会触发同步,可以理解为ts.commit=session.flush()+commit ---- 脱管态 转换 通过session

53340

Hibernate总结以及面试中的一些问题.

如果类的映射使用了代理(proxy),load()方法会返回一个初始化的代理,直到你调用该代理的某方法才会去访问数据库。...查询 Hibernate中使用查询,一般使用Hql查询语句。...**当执行setName后,一级缓存里面的数据发生了改变,缓存flush,会对比缓存和快照,如果不一致,那么会将缓存中的内容同步到数据库,并更新快照!...: 事务提交,session会flush   ------- commit 、session.flush MANUAL :只有手动调用  session.flush 才会刷出  ----  session.flush...**更新时间戳区域,记录数据最后更新时间,使用二级缓存,比较缓存时间t1 与更新时间 t2 , 如果 t2 > t1 丢弃原来缓存数据,重新查询缓存 查询缓存 有人称查询缓存 为hibernate

1.6K120

NHibernate 缓存

注意: 如果查询不想使用一级缓存, 可以 StatelessSession 对象, 和 Session 对象用法一样, 只是该对象没有一级缓存。...启用二级缓存 Nh 默认启用二级缓存, 启用二级缓存需要如下步骤: 1、 hibernate.cfg.xml 文件中添加下面三个属性: <property name="cache.provider_class...[CategoryID]=@p0; @p0 = 1 [Type: Int32 (0)] 从测试用例的输出可以看出, 二级缓存<em>时</em>可以<em>在</em>不同的 session 之间共享。...<em>查询</em>二级缓存配置 Cacheable 为一个<em>查询</em>显示启用二级缓存; CacheMode 缓存模式, 有如下可选: Ignore:<em>更新</em>数据<em>时</em>将二级缓存失效,其它时间不和二级缓存交互 Put:向二级缓存写数据...,但不从二级缓存读数据 Get:从二级缓存读数据,仅在数据<em>更新</em><em>时</em>向二级缓存写数据 Normal:默认方式。

57811

Hibernate 脏数据检查

我们看下面的代码: 当事务提交,Hibernate会对session中的PO(持久化对象)进行检测,判断持久化对象的状态是否发生了改变,如果发生了改变就会将改变更新到数据库中。...,这时拦截器会捕获这个动作,并且将改属性标志为已经改变,之后的数据库操作将其更新到数据库中。...这种方法降低了同步更新的实时性,但是当一个数据对象的很多属性发生改变,由于持久层框架缓存的存在,比对版本可以充分利用缓存,这反而减少了更新数据的延迟。...当调用tx.commit();好戏就此开场,commit()方法会调用session.flush()方法,调用flush()方法,会首先调用flushEverything()来进行一些预处理(如调用...如果没有发生异常,而且经过版本比对判断确实实体属性发生了改变,则向当前的更新任务队列中加入一个新的更新任务,此任务将在将在session.flush()方法中的execute()方法的调用中,转化为相应的

1.4K60

NHibernate 缓存

注意: 如果查询不想使用一级缓存, 可以 StatelessSession 对象, 和 Session 对象用法一样, 只是该对象没有一级缓存。...启用二级缓存 Nh 默认启用二级缓存, 启用二级缓存需要如下步骤: 1、 hibernate.cfg.xml 文件中添加下面三个属性: <property name="cache.provider_class...[CategoryID]=@p0; @p0 = 1 [Type: Int32 (0)] 从测试用例的输出可以看出, 二级缓存<em>时</em>可以<em>在</em>不同的 session 之间共享。...<em>查询</em>二级缓存配置 Cacheable 为一个<em>查询</em>显示启用二级缓存; CacheMode 缓存模式, 有如下可选: Ignore:<em>更新</em>数据<em>时</em>将二级缓存失效,其它时间不和二级缓存交互 Put:向二级缓存写数据...,但不从二级缓存读数据 Get:从二级缓存读数据,仅在数据<em>更新</em><em>时</em>向二级缓存写数据 Normal:默认方式。

42810

盘点 .NET 比较流行的开源的ORM框架

经过数十个版本的更新迭代发布全新v2.0版本,支持动态列/表、分库/分表等。...查询接口类似于 LINQ。您可以使用 Chloe.ORM 通过 lambda 查询 LINQ 之类的数据并执行任何操作(查询 | 组查询 | 聚合查询 | 插入 | 批量更新 | 批量删除)。...开源地址:https://github.com/dotnet/ef6 六、NHibernate(国外) NHibernate 是一个成熟的开源对象关系映射器,适用于 .NET 框架。...开源地址:https://github.com/nhibernate/nhibernate-core 七、ServiceStack/ServiceStack.OrmLite(国外) 简单的 .NET 的快速...异步或同步,选择权您。(又名异步)(V6) 与严格修饰的 POCO 或归属的几乎 POCO 一起使用。 易于配置,包括开箱即用的流畅配置。

3.9K41

NHibernate中关于Inverse的理解和使用

使用NHibernate进行数据库操作的时候,比如数据插入的时候,经常用到级联功能,比如最常见的就是一个订单对应多个明细行,保存订单只需要Save订单对象即可,订单下的所有明细行会级联保存。...SQL语句上可以看到明细的区别,默认Inverse为false的情况下,保存OrderItem,其数据库的字段OrderId是设为null,然后再将Order的Id重新Update到OrderItem...【注意:这里是说最终结果,而不是中间结果,Insert OrderItem的时候,其OrderId为该对象对应的Order对象的Id,如果该Order对象保存,则OrderId为null,如果是已保存的...所以一般建议Mapping设置Inverse为True。对应的,Code中也需要设置OrderItem对Order的引用。 Inverse更大的用处是ManyToMany的时候。...总结: Inverse用于设置双向关联Nhibernate设置外键依赖的对象,默认Inverse=False,一对多时表示依赖一端的集合,如果为True表示依赖多段对象中对一端对象的引用。

44230

NHibernate教程

一、NHibernate简介 今日的企业环境中,把面向对象的软件和关系数据库一起使用可能是相当麻烦、浪费时间的。NHibernate是一个面向.Net环境的对象/关系数据库映射工具。...由此可见,NHibernate不仅仅管理.Net类到数据库表的映射,还提供数据查询和获取数据的方法。因此采用NHibernate,可以大幅度减少开发时人工使用SQL处理数据的时间。...配置NHibernate (1)NHibernate的配置文件有两种:桌面应用程序(WinForm)中为App.config,在网页应用程序(WebForm)中为web.config。...使用NHibernate的API进行编程 数据库编程不外乎“添加”、“删除”、“更新”,看看NHibernate是如何实现这三种操作吧。...NHibernate.ISessionFactory SessionFactory=null; (2) 系统初始化的时候加载XML,并创建Factory mCfg.AddXmlFile(

33110

2022年了有哪些值得推荐的.NET ORM框架?

它支持 LINQ 查询、更改跟踪、更新和架构迁移。...EntityFramework-Plus - EF的增强工具集,包括过滤器,审核,缓存,查询,批删除,批更新等。...EntityFramework.Exceptions - 当您的SQL查询违反SqlServer,MySql或PostgreSQL中的数据库约束,请对EntityFrameworkCore使用类型化的异常处理...查询接口类似于 LINQ。您可以使用 Chloe.ORM 通过 lambda 查询 LINQ 之类的数据并执行任何操作(加入查询 | 组查询 | 聚合查询 | 插入 | 批量更新 | 批量删除)。...它极大地帮助开发人员开发过程中进行上下文切换简化体验。 开源软件——它是一个开源软件,并且永远是免费的。它旨在进一步改进 .NET 数据访问体验和解决方案,以及社区的集体思想。

5.7K11
领券