[EF]Entity Framework 4.1乱抛EntitySqlException的BUG

Entity Framework 4.1乱抛EntitySqlException的BUG

罗朝辉 (http://kesalin.cnblogs.com/)

本文遵循“署名-非商业用途-保持一致”创作公用协议
 

今天在使用 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() 的约束条件了

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

posted @   飘飘白云  阅读(1558)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
本博客遵循 Creative Commons License “署名-非商业用途-保持一致”创作共用协议。 与我联系
点击右上角即可分享
微信分享提示