Entity Framework 4.1乱抛EntitySqlException的BUG

本文探讨了在使用EntityFramework处理并发冲突时遇到的异常问题,详细解释了异常产生的原因,并提供了两种解决方案:一是通过避免调用GetDatabaseValues()方法来获取客户端和服务器端的数据,二是将DBContext实例和Modelentity放在同一命名空间下以满足GetDatabaseValues()的约束条件。同时,文章强调了选择解决方案时应考虑的权衡因素。

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

今天在使用 Entity Framework 处理并发冲突时,碰到一个奇怪的BUG:

引发 BUG 的代码:

 

    try

            {

                if (ModelState.IsValid)

                {

                    db.Entry(entityObject).State = EntityState.Modified;

                    db.SaveChanges();

                    return RedirectToAction("Index");

                }

            }

            catch (DbUpdateConcurrencyException ex)

            {

         var entry = ex.Entries.Single();

                var databaseValues = (XXXProject.Models.XXXEntity)entry.GetDatabaseValues().ToObject();

                var clientValues = ( XXXProject .Models. XXXEntity )entry.Entity;

                ......

            }

 

BUG现象:

 

EntitySqlException: Type 'XXXProject.Models.XXXEntity' could not be found. Make sure that the required schemas are loaded and that the namespaces are imported correctly.

 

 

BUG原因:

DBContext 实例和 Model entity 不在同一个命名空间下,Entity Framework 4.1 中的 GetDatabaseValues()就会抛出异常。经查证,这是 Entity Framework 4.1 的一个BUG,详细讨论请参看:这里

 

解决方案之一:

var clientValues = (Department)entry.CurrentValues.Clone().ToObject();

entry.Reload();

var databaseValues = (Department)entry.CurrentValues.ToObject();

这样就避开了对 GetDatabaseValues()的调用,而同时能获取到客户端的值以及服务器端的值。唯一要注意的是 entry 已经重新 Reload 了,之前客户端做出的修改如果想要保持就得在 Reload 之前备份。

 

解决方案之二:

将 DBContext 实例和 Model entity 放到同一个命名空间下,这样就满足 GetDatabaseValues() 的约束条件了

不推荐使用这种方案,因为这样修改代码较多,且违背分层隔离原则。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值