用NHibernate,总感觉怪事多罗罗。

比如说,明明我们是在查询,却报错,刨根问底找到出错原因,竟然是因为执行了一些Update甚至Insert!老天,我们明明只是查询而已,什么时候有更新过数据?NHibernate,你是不是傻的?

但事实就是事实,它就是发生了,它就是报错了。

前几天,我再次遇到这个问题:查询导致Update。

我留意了一下代码,发现这个实体类有个对象首先从数据库中获取出来,这时候一切正常。

然后,对这个实体对象进行了一系列的赋值操作。

接着,代码又从数据库中获取一个该实体类的集合,这时,在执行ToList()的时候就报错了!

ToList(),意味着真正到数据库中执行。查找错误原因,是系统执行了一个Update语句,对非空字段进行了空值操作。又回到了那个问题:查询为何导致Update?

我对NHibernate一知半解,原理机制不甚了了。但在这里,我似乎明白了:

并不是查询导致了Update,而是对引用类型对象进行了操作,导致了NHibernate自动Update。

C#中,变量有两种类型:值类型和引用类型。我在代码中操作的实体类对象是引用类型。所谓的引用类型,就是在内存中只有一份数据,然后所有同类型的对象都是用指针指向它而已。只要在任意一个对象中赋值,都导致这份数据的更改;我用NHibernate得到这个实体类对象后,对它的属性进行了赋值,然后再次去请求相同类型的集合时,NHibernate察觉到数据已经改变,所以会先更新数据库,然后再输出。

明白了。我将获得集合语句提到最前面,赋值语句在后,果然不会报错了。

最新文章

  1. HTML Select 标签选择后触发jQuery事件代码实例
  2. JavaScript之基础篇
  3. c#动态编译并动态生成dll
  4. Java并发编程学习笔记(一)——线程安全性
  5. Delphi 10.1 Berlin UTF8String Test
  6. Eclipse功能集合
  7. JavaScript(七)——视频插入
  8. 解决maven的“Dynamic Web Module 3.0 requires Java 1.6 or newer.”错误
  9. RMAN备份与恢复之表空间
  10. 批量更改数据库COLLATION
  11. Android DropBoxManager Service
  12. uva 193 Graph Coloring(图染色 dfs回溯)
  13. svn修改log信息
  14. 【java提高】Serializable(一)--初步理解
  15. laravel框架——验证码(第一种方法)
  16. CodeIgniter框架对数据库查询结果进行统计
  17. webpack中babel配置 --- runtime-transform和babel-pollfill
  18. Unity Lighting(一)光照练习
  19. NHibernate中Session的处理 线程不安全
  20. 20170906xlVBA_CopyDataAndFormatFromSheets

热门文章

  1. java指令详解
  2. Python3--中括号"[]"与冒号":"在列表中的作用
  3. Django 动态建表
  4. 【转】玩玩负载均衡---在window与linux下配置nginx
  5. 在mysql的操作界面中,如何清屏幕
  6. mysql异常Incorrect string value: '\xE6\xB5\x8B\xE8\xAF\x95' for column 'region_name'
  7. CSS中display对布局的影响以及元素display的默认值
  8. NYOJ 203 三国志
  9. zoj 1251 Box of Bricks
  10. php 面向对象 (类 对象)