C#Entity Framework 4公共语言运行时检测到无效的程序错误?

如何调试/修复“公共语言运行时检测到无效程序”错误? 究竟到底是什么意思?

我有一个C#MVC 2 Web应用程序,可以部署到位于同一IIS 7.5 Web服务器(x64)上的两个网站。 一个是实时站点(使用Release配置部署),第二个是beta站点(使用仅为此项目创建的新Beta配置部署)。

这两个网站是:

Default Website/my_app Beta/my_app 

在测试网站上选择分页的采购订单时,它会抛出“检测到无效程序”exception。 在现场网站上运行完全相同的代码完美无缺。 为什么要这样做?

编辑:我在服务器上安装了Visual Studio,并找到导致问题的实际行和堆栈跟踪:

 var list = ObjectContext.ObjectSet.AsQueryable(); int totalRecords = list.Count(); var paged = list.Skip((page > 0 ? page - 1 : 0) * rows).Take(rows); 

这是带有堆栈跟踪的exception消息:

 {System.InvalidProgramException: Common Language Runtime detected an invalid program. at System.Data.Entity.DynamicProxies.PurchaseOrderListVie_96479BFE9FA60F4C53137C56C1A1B2A11D90FF5AFFDC20383CC68E0A750792E3.set_Total(Decimal ) at lambda_method(Closure , Shaper ) at System.Data.Common.Internal.Materialization.Shaper.HandleEntityAppendOnly[TEntity](Func`2 constructEntityDelegate, EntityKey entityKey, EntitySet entitySet) at lambda_method(Closure , Shaper ) at System.Data.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper shaper) at System.Data.Common.Internal.Materialization.Shaper`1.SimpleEnumerator.MoveNext() at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) at MyApp.Controllers.PurchaseOrderController.GetPurchaseOrderList(Int32 page, Int32 rows, String sidx, String sord) in C:\src\MyApp.2010\MyApp.UI\Controllers\PurchaseOrder\List.cs:line 11} 

这个新信息准确显示问题所在,但不是问题所在。 希望能够很好地了解entity framework的人能够阐明这一点:

 System.Data.Entity.DynamicProxies.PurchaseOrderListVie_96479B_etc.set_Total(Decimal ) 

是发生错误的行。 现在我在sql management studio中运行查询,结果不是null,而Total也不是null。 那么为什么调用set_Total()会有问题呢?

这是POCO定义Total字段(由T4模板生成)的方式:

 [Decimal] [Required] [DisplayName("Total")] public virtual decimal Total { get;set; } 

live和beta站点之间的主要区别在于构建配置。 但是这两种配置都将每个项目设置为“任何CPU”。

我们所有的开发机器和服务器都是64位。 导致此问题的网站的IIS配置是否会有所不同?

我已经尝试过运行PEVerify – 但它只是说“所有类和方法已经validation”。 PEVerify如何帮助解决这类问题?

顺便说一句,我可以看到标题中有“共同语言运行时检测到无效程序问题”的大约15个问题。 我的问题不是重复,并且有几个独特的function与具有相似标题的其他问题不同(这15个中只有一个是关于entity framework的 – 其余的是关于Reflection或TFS)

我今天遇到了这个问题,当时我将实现linq的web应用程序部署到我们的QA环境中。 该问题原来是Windows 2008 R2服务器上的IIS设置。 在应用程序池的“高级设置”下,“启用32位应用程序”的设置设置为“False”。 我将其设置为True,现在我的应用程序就像在开发服务器上一样,它恰好是Windows 2003服务器。 我希望这有帮助。

对我来说,这是在我向实体模型添加视图时发生的。 默认情况下,设计器将所有列Entity Key属性设置为true。 当我为所有十进制/数字列设置为false时,错误消失。 泰斯

您是否尝试在另一台计算机上部署beta配置? 您的apppool设置是否相同(即经典与集成,相同的.net版本)? 您是否尝试过清理解决方案并重新部署到新位置? 您是否尝试将beta版部署到发布位置? (确保在发布之前删除所有文件;我很好奇,如果剩余的动态加载依赖项可能导致问题)

更新:

优秀的更多信息。 在第3行,您正在定义变量页面,同时还使用先前定义的名为page的变量。 怎么编译? 尝试评论该代码或至少尝试不跳过。

注意:我认为Count()后跟Take()可能会执行两次查询。

注2:我只使用了EntityFramework v4 Database First开发,但我不记得直接针对ObjectSet进行编程。 通常它是你的实体类(例如,MyContext.Orders)……也许正在对该对象进行编程并设置Decimal值。 该属性的模型是否有任何属性使其不标准?

有一个主要的错误!!,我认为它是在Entity框架中具有十进制字段列属性,

我遇到了这个讨厌的错误消息,我比较了从2个单独的表(相同的表)获取数据,一个具有整数列ID,另一个具有十进制列ID,

对于具有整数列的表,没有问题相同的代码运行完美,对于带有十进制列的表,此错误消息弹出我已经检查sql server iis和环境,我甚至想格式化PC,它非常奇怪和错误消息不清楚。

希望这种方法可以帮助任何人在将来遇到这样的错误。