使用Nhibernate修改实体主键并保存数据

   近来做项目的过程中,要实现类似于数据“复制”的功能。现将功能背景描述一下,数据持久层使用ORM之Nhibernate类库,先将一个要复制的数据Load到一个实体类中,再修改实体类主键的值;在修改主键值的过程中,出现Exception(异常信息大概就是主键内容不能修改),经过详细查看异常信息,发现Nhibernate对load查询出的实体类,在进行保存的时,会将保存的实体与Session中缓存的实体类进行比较,来判断实体类主键是否更改,Nhibernate拥有这样的检查机制也是保证数据的完整性和正确性。在这就会有个问题,Session怎么知道将要保存的实体类是否Load出的实体是同一个对象并进行比较,个人理解是这样的,实体类对象是引用类型,在操作过程中引用地址是不会变更的,所以只需要通过引用地址就可以判断是否为同一对象,进而判断主键是否变化。

   根据以上背景和个人妄自猜测,要避免Nhibernate的check中抛出异常只能,新实例化一个对象(重新分配地址),问题就可以解决。我通过实体类克隆,通过一个已存在的实体来获得一个新的实体,进而变更主键值并进行实体类保存的操作。

注意:通过实体类赋值是不可以的,因为实体类赋值后,两个实体对象指向的是同一个对象引用,保存时还会出现问题。

 

posted @ 2010-06-17 14:30  D董一点  阅读(1707)  评论(0编辑  收藏  举报