行情北京 上海 广州 深圳 沈阳 济南 郑州 武汉 长沙 南京 西安 成都 昆明 杭州
e杂志下载
 首页 | 资讯 网刊 视频 评测  企业:服务器 网络 存储 通信 安全 技术开发 信息化-方案 | ITPUB IXPUB
 商务笔记本 台式机 投影机 打印扫描 办公产品 耗材 软件 学院 下载 驱动  家庭数字家电 家庭组网
 个人DIY硬件 | 手机 GSM CDMA 无线电 GPS| 数码影像 相机 摄像机 | 消费数码 MP3 | 论坛 | 经销商社区
 报价中心 三维图秀 产品评论 产品大全 使用手册 术语详解 厂商专区 二手市场 维修服务 疑难解答 IT搜索
 

NHibernate的SaveOrUpdate的一个小问题

作者:佚名 发表日期:2007-04-01 12:26
  内容导航: 上一页 1 下一页
 

【IT168 技术文档】前面参考来的代码在数据处理类里面基本上都是直接使用SaveOrUpdate来保存数据,让系统自动判断是新增的还是更新的。但是用在我的代码里就有问题,保存第一条数据就会提示数据错误,记录可能被改动之类的。在网上找了半天也没看到有什么有用的线索。

今天再做的时候突然看到一条信息,NHibernate不是通过到数据库里查找这条记录在不在来判断它是更新还是插入的,而是通过主键的值来判断,这里就要用到那个unsaved-value的值了。如果主键的值等于这个未保存前的值,那么这条记录就是要新建的,如果不等于,那么它就是要更新的了。

通常我所看到的参考代码,这个unsaved-value都是设为null的,所以我的代码里也全部是设为null的,但是没有想到,我的代码里所有的主键都是数字型的,生成对象的时候会给这个字段设成默认值0,所以在保存第一条数据的时候NHibernate会以为我要更新数据,但是这个主键的值是系统自动生成的,因此这个Update语句会报错。将所有的配置文件改成unsaved-value="0",测试通过。

这里就带来了另一个问题,在另一套系统中,分析人员认为系统中的表关联太多,如果使用自动增长字段作为关键字,容易出现冲突问题,于是使用一个自动增长字段的表来为全局生成主键,那么所有的其它表的主键就都是assigned,而不是identity了,这时候unsaved-value就没有意义了,因为新建的对象你也要手动给它赋这个值。这样的话系统就没有办法自动判断是更新还是插入了,只能手动分开使用Save或者Update方法。

真是个有趣的功能。我倒是从来没有使用过自动生成字符串型主键的数据库功能,那种冲突的发生率会更高。

上一页 1 下一页
【内容导航】  
【相关文章】  
下一篇:NHibernate源代码浅读
©版权所有。未经许可,不得转载。 【责任编辑:晓徐
 
  网友评论