2006-4-26 1:13:28
NHibernate的SaveOrUpdate的一个小问题
前面参考来的代码在数据处理类里面基本上都是直接使用SaveOrUpdate来保存数据,让系统自动判断是新增的还是更新的。但是用在我的代码里就有问题,保存第一条数据就会提示数据错误,记录可能被改动之类的。在网上找了半天也没看到有什么有用的线索。
今天再做的时候突然看到一条信息,NHibernate不是通过到数据库里查找这条记录在不在来判断它是更新还是插入的,而是通过主键的值来判断,这里就要用到那个unsaved-value的值了。如果主键的值等于这个未保存前的值,那么这条记录就是要新建的,如果不等于,那么它就是要更新的了。
通常我所看到的参考代码,这个unsaved-value都是设为null的,所以我的代码里也全部是设为null的,但是没有想到,我的代码里所有的主键都是数字型的,生成对象的时候会给这个字段设成默认值0,所以在保存第一条数据的时候NHibernate会以为我要更新数据,但是这个主键的值是系统自动生成的,因此这个Update语句会报错。将所有的配置文件改成unsaved-value="0",测试通过。
这里就带来了另一个问题,在另一套系统中,分析人员认为系统中的表关联太多,如果使用自动增长字段作为关键字,容易出现冲突问题,于是使用一个自动增长字段的表来为全局生成主键,那么所有的其它表的主键就都是assigned,而不是identity了,这时候unsaved-value就没有意义了,因为新建的对象你也要手动给它赋这个值。这样的话系统就没有办法自动判断是更新还是插入了,只能手动分开使用Save或者Update方法。
真是个有趣的功能。我倒是从来没有使用过自动生成字符串型主键的数据库功能,那种冲突的发生率会更高。
0
推荐到鲜果:


评论