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

本文介绍了使用NHibernate框架时遇到的问题及解决方案。主要讨论了如何在不触发框架内置检查机制的情况下,完成实体主键的复制操作。文章提出了通过实体克隆的方法来规避异常,并解释了直接赋值不可行的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

 

转载于:https://www.cnblogs.com/ajian/archive/2010/06/17/1759524.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值