EntityFrameWork使用TransactionScope分布式事务,存储区更新、插入或删除语句影响到了意外的行数(0)。实体在加载后可能被修改或删除。刷新 ObjectStateManage...

最近在开发一个小型的物业管理系统,系统其中有一个功能需要每个月按抄的水表、电表等生成相应的费用,数据库主要的基础数据表有大楼水、电表、楼层水、电表、房间水电表;其中大楼和楼层的水电表是用于计算公摊的;系统设计有一个费用的统计表,表名ChargeAccountMaster,表内设计的有一个字段ID,主键 、 自增长;计算时由于是数据核算统计,所以引入事务计算数据的同时,也会把相应计算的结果回写回基础数据表中,计算的类是service层,框架的ORM用的是EF,就没有采用本地事务,采用了分布式事务TransactionScope,代码如下:

            TransactionOptions transactionOption = new TransactionOptions();

            //设置事务隔离级别
            transactionOption.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
            // 设置事务超时时间为120秒
            transactionOption.Timeout = new TimeSpan(6000000000);
            using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, transactionOption))
            {
                 .....................业务代码
                  scope.Complete();
   
         }  

 最初数据统计写入数据库的场景是,先初始化ChargeAccountMaster 表,对表内的每一个字段的值都进行初始化,插入数据库;然后在计算和统计每一个基础数据表后得出结果再Update该表,在开发的时候,这种方式一直没有出错,直接发布到生产环境,将正式的数据导过来,进行大查的数据核算时结果报错了:存储区更新、插入或删除语句影响到了意外的行数(0)。实体在加载后可能被修改或删除。刷新 ObjectStateManager 项 ;刚见到这个错误时,头都大了,没有任何的提醒,只好找度娘,找到如下答案:

主键没有赋值,造成数据库的值与程序的主键值的ID没有对应上

通过调试,由于数据库的ID设计为自增,所以在程序时中就没有直接赋值,跟踪到数据插入,发觉自增的ID在EF 第一次 SaveChange()后,是有返回ID的,且插入数据是成功的,但由于数据的错误,事务却未能提交;但第二就插入不成功,就开始报这个错误了。

一直以为大家都写的ID没值,刚好第二次确实没有返回值,一直以为就是ID的问题,就在这上面花了很多时间,调整事务的隔离属性、范围内、把自增的ID改为程序生成写入都没有效果,还是报同样的错误;最后没办法,在想第一交都有值,那么只做一次性插入,不做前面的初始化,初始化的动作在程序上做,每计算完一个基础数据然后直接在程序上更新,最后统一插入和更新数据库,结果却成功了,问题解决了,却找不到出现问题的原因。

个人分析:事务是不是在插入数据后(SaveChange),不允许再对当前的数据进行更新,那么为什么在开发的时候,却没有了出现这个问题?

 

将问题记录在这,找到问题的原因再来更。。。。。。

 

转载于:https://www.cnblogs.com/bshareZone/p/7533585.html

您好!对于 EF 更新删除操作时出现的错误“存储更新插入删除语句影响到了意外行数(0)。实体加载可能修改删除”,可能有以下几种可能的原因和解决方法: 1. 实体已被其他操作修改删除:在执行更新删除操作之可能其他地方已经修改删除了该实体。您可以在执行操作之,先重新加载实体以确保它是最新的数据,并且没有被其他操作修改删除。可以使用 `DbContext.Entry(entity).Reload()` 方法重新加载实体。 2. 实体的状态未正确设置:在执行更新删除操作之,确保实体的状态正确设置。如果实体是从数据库中查询出来的,那么它的状态应该是已附加(`EntityState.Unchanged`);如果是新创建的实体,那么应该是已添加(`EntityState.Added`)。可以使用 `DbContext.Entry(entity).State` 属性来设置实体的状态。 3. 数据库模型与实体类不一致:如果数据库模型与实体类定义不一致,可能会导致更新删除操作失败。请确保数据库模型和实体类的字段、关联关系等定义是一致的。 4. 数据库约束限制:更新删除操作可能违反了数据库约束限制,例如外键约束、唯一性约束等。请检查数据库约束,并确保操作不会违反这些约束。 5. 其他并发操作导致的冲突:如果多个用户同时对同一实体进行操作,可能会导致并发冲突。您可以考虑使用乐观并发控制机制,例如使用版本号或时间戳列来检测并发冲突,并处理冲突情况。 希望以上解答对您有帮助!如果问题仍然存在,请提供更多的上下文信息,以便更好地帮助您解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值