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

当我在Query上调用NHibernate方法时,为什么Update创建一个临时表?

当在Query上调用NHibernate的Update方法时,NHibernate会创建一个临时表的原因是为了实现更新操作的效率和安全性。

创建临时表的目的是为了避免在更新操作过程中出现数据冲突或数据丢失的情况。通过创建临时表,NHibernate可以将更新操作分为两个步骤:首先将需要更新的数据复制到临时表中,然后再将临时表中的数据更新回原始表中。

这种方式可以确保在更新过程中不会丢失任何数据,并且可以避免多个并发更新操作之间的数据冲突。临时表还可以提高更新操作的效率,因为它可以减少对原始表的直接更新操作,而是通过临时表进行更新。

临时表的创建和使用是NHibernate框架内部的实现细节,对于开发者来说并不需要过多关注。在使用NHibernate进行开发时,只需要调用Update方法并传入相应的参数即可,NHibernate会自动处理临时表的创建和更新操作。

推荐的腾讯云相关产品:腾讯云数据库TDSQL、腾讯云云服务器CVM

  • 腾讯云数据库TDSQL:腾讯云数据库TDSQL是一种高性能、高可用的云数据库服务,支持主从复制、读写分离等功能,适用于各种规模的应用场景。了解更多:腾讯云数据库TDSQL产品介绍
  • 腾讯云云服务器CVM:腾讯云云服务器CVM是一种弹性、可扩展的云计算服务,提供灵活的计算能力和丰富的网络和存储资源,适用于各种应用场景。了解更多:腾讯云云服务器CVM产品介绍
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C# 数据操作系列 - 11 NHibernate 配置和结构介绍

一个ADO.NET连接的封装,用来提供ITransaction的工厂。提供了一个通过主键检索对象和导航链接查询对象的一级缓存。也就是EF Core中的导航属性。...Transient Objects and Collections(临时对象和集合): 表示临时的未被ISession托管的持久化对象,它们被应用层临时创建但直到ISession关闭都不会被持久化。...实例状态 NHibernate中,一个可持久化的对象有三种不同的状态,依据与持久化上下文之间的关系不同,其中ISession就是一个持久化上下文。...状态分为以下三种: transient 暂存的、临时的 该状态的对象并没有被持久化上下文捕获到,简单来讲就是刚被创建,还没有从数据库/持久化上下文中获取到主键信息。...其中create表示每次只创建新增的;create-drop表示每次ISessionFactory创建创建 ,ISessionFactory关闭,删除;其中update表示每次都会将DDL SQL

1.2K20
  • NHibernate总结

    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操作,在看该文件的代码

    92540

    Nhibernate入门与demo

    其中:李永京的博客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

    35230

    架构之路(六):把框架拉出来

    所以我就用了一个最蛮最笨的方法:我自己做一个系统,严格按照我自己对于这些概念的理解进行开发,看最后这条路能不能走出来?历经五年甚至更多时间的摸索和实践,我觉得我基本是走出来了。...然后,可以通过NHibernate的session,调用 session.Save(), session.Delete(), session.Load()和session.Query()等方法将对象存储.../// 为什么NHibernate? /// 1、我的项目开始得比较早,好几年前了,应该是。...我们“增”和“删”直接利用了NHibernate的session机制,只是把“查(select)”给单独抽象了出来,也单独的抽象成一个名为Query的project。...都搅在一起,真不知道该放在哪里说 为什么不使用Repository模式而采用Query ViewMode的Map:使用Automapper 单元测试:Query又要搅到数据库,唉……

    59490

    NHibernate 多对多映射的数据更新

    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 是更好的选择。

    94910

    NHibernate教程

    一、NHibernate简介 今日的企业环境中,把面向对象的软件和关系数据库一起使用可能是相当麻烦、浪费时间的。NHibernate一个面向.Net环境的对象/关系数据库映射工具。...NHibernate除了能将一张映射为一个对象,还可以将间关系变为对象的属性。例如学生和课程间的多对多关系就可以转化为学生类中的一个课程集合的属性。...由此可见,NHibernate不仅仅管理.Net类到数据库的映射,还提供数据查询和获取数据的方法。因此采用NHibernate,可以大幅度减少开发时人工使用SQL处理数据的时间。...二、NHibernate使用步骤 1.为系统引入NHibernate的库,并且配置NHibernate; 2.新建一个将要持久化.Net对象的; 3.构建一个需要被持久化的.Net类; 4.构建一个可以让...创建一个用于测试的 这里需要创建3张,分别用于保存:学生、课程、选课信息。可以用Sql语句来创建,也可以用其他方式创建

    36910

    NHibernate 缓存

    一级缓存 一级缓存就是 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 共享。

    60211

    NET中小型企业项目开发框架系列(一个

    数据訪问层,页面层,数据模型层以及一个公共类的部分,每层我们在这个基础抽象了相应的接口,这样一层仅仅须要对下一层,面向接口编程。同一候有Spring.NET来管理层之间的关系。...一个抽象类实现增删改查的同一候又添加了子类的自身扩展性....(单查询) /// /// 通过一个条件查询(单查询) /// /// <param name...一个是ICaseAssignEntityRepository自己的业务逻辑接口(实现了子类的拓展,比方某个类中想要加入这个类特有的方法。仅仅须要在自己的接口中填写就可以)。...通过这个继承体系保证了我们实现增删改查的同一候外放一个接口保证扩展性.

    57910

    NHibernate实践与模式

    (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操作。

    81240

    NHibernate学习笔记之一,Hello world!

    准备工作: 需要使用.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中的方法

    60020

    NHibernate 缓存

    一级缓存 一级缓存就是 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 共享。

    44310

    数据存储之-SQLite数据库一

    ---- 使用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()就会在下述目录下创建我们的

    65820

    SqlAlchemy 2.0 中文文档(五十四)

    解决这个问题的方法是始终指定确定性的排序顺序,以便主查询始终返回相同的行集合。这通常意味着你应该在一个唯一列使用Select.order_by()。...相反,一种典型的方法是,当首次调用基于 ORM 的方法和函数,从最顶层调用函数的过程将处于一个块中,该块一系列操作成功完成提交事务,并且在任何原因失败,包括失败的 flushes 回滚事务。...如果flush()完全回滚逻辑事务,那么当我们到达except:块,Session将处于干净状态,准备全新事务发出新的 SQL,并且调用Session.rollback()将不按顺序进行。...如果一个查询User()对象,多次列表中获取相同对象实际并没有太多意义。有序集合可能更好地表示Query 返回完整对象所寻求的内容。...如果flush()完全回滚逻辑事务,那么当我们到达except:块,Session将处于干净状态,准备全新的事务发出新的 SQL,并且对Session.rollback()的调用将处于不正确的顺序

    27310

    Spring认证中国教育管理中心-Apache Cassandra 的 Spring 数据教程四

    使用该INSERT操作的简单案例是保存一个 POJO。在这种情况下,名由简单的类名(而不是完全限定的类名)确定。可以使用映射元数据覆盖存储对象的。 插入或更新,id必须设置该属性。...第二种方式是@Table注解中指定名。 批量插入、更新和删除单个对象 Cassandra 协议支持使用批处理一个操作中插入一组行。...调用方法创建新的不可变(中间)Update对象。 9.9.4.删除行的方法 您可以使用以下重载方法从数据库中删除对象: boolean 删除 (Query query, Class<?... Java 中创建Query 和Criteria实例使用静态导入以提高可读性。...Query一经创建即不可变。调用方法创建新的不可变(中间)Query对象。

    1.7K10

    Nhibernate_nhibernate与ef区别

    步骤1:创建数据库 我们正在做的是一个非常简单的NH示例.在这个例子里面,我们实现一个基本的用户管理子系统.我们将会使用一个user(sql server 2000): use NHibernate...步骤2:创建.Net类: 当我们这样一堆的用户的时候,我们需要某种对象来保存.NH是通过reflection对象的属性来工作的,所以我们给需要持久化的对象添加属性.一个对应于上面数据库结构的类可以写成这个样子...步骤3:编写映射文件(Mapping File) 现在我们有了数据库和.Net类,我们还需要告诉NH怎样在数据库和类之间映射.这就需要映射文件了.最简捷(也是可维护性最好的)方法就是为每一个类编写一个映射文件...步骤4:创建数据库配置文件 目前为止,我们还没有告诉NH到哪儿去找数据库.最直接的方法就是在你程序的配置文件中给NH一个部分,就是这样: <?...代码里面使用NHibernate是很简单的事情: 1. 创建一个Configuration对象. 2.

    59330
    领券