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

8

如何调试/修复“Common Language Runtime detected an invalid program”错误?它到底是什么意思?

我有一个C# MVC 2 Web应用程序,可以部署到同一IIS 7.5 Web服务器(x64)上的两个网站。其中一个是活动网站(使用发布配置部署),第二个是测试网站(使用专门为此项目创建的新Beta配置部署)。

这两个网站分别是:

Default Website/my_app
Beta/my_app

在beta网站上选择分页的采购订单列表时,会抛出“检测到无效程序”异常。但是完全相同的代码在live网站上运行正常。为什么会这样呢?
编辑:我在服务器上安装了Visual Studio,并找到了导致问题和堆栈跟踪的实际代码行。
var list = ObjectContext.ObjectSet.AsQueryable();
int totalRecords = list.Count();
var paged = list.Skip((page > 0 ? page - 1 : 0) * rows).Take(rows);

这是带有堆栈跟踪的异常信息:

{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管理工具中运行了查询,结果不为空,Total也不为空。那么为什么调用set_Total()时会出现问题呢?

这是POCO如何定义Total字段(由T4模板生成):

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

Live网站和Beta网站的主要区别在于构建配置。但是两种配置都将每个项目设置为“Any CPU”。
我们所有的开发机和服务器都是64位的。网站的IIS配置之间可能会有差异吗?
我尝试运行PEVerify,但它只显示“已验证所有类和方法”。PEVerify如何帮助解决这种问题?
顺便说一句,我看到有大约15个标题包含“Common Language Runtime detected an invalid program problem”的问题。我的问题不是重复的,它具有与其他具有类似标题的问题不同的几个独特特征(其中只有一个问题与Entity Framework有关 - 其余问题涉及Reflection或TFS)。

是的,唯一的区别就是数据库连接字符串。发布版和测试版都使用相同的基础web.config文件,然后通过Web Deploy添加正确的连接字符串。 - JK.
增加了100美元的赏金来尝试解决这个问题。 - JK.
我对连接字符串的差异持怀疑态度。你是否尝试使用测试版连接字符串部署生产配置? - Michael Ames
好的,我从你之前的评论中看到你计划使用beta连接字符串进行测试。因此,你已经排除了虚拟目录和连接字符串作为罪犯。此时听起来你真的只剩下了构建配置;也就是说,工作和不工作之间唯一的功能区别是“Debug”与“Release”设置??天哪... - Michael Ames
已部署发布配置,但随后编辑以使用Beta数据库连接字符串。现在我将尝试发布配置加发布DB配置。这不是“调试”设置,而是一个全新的名为“Beta”的配置。我想知道内置的Debug/Release配置是否具有手动创建的配置所没有的一些特殊属性?好的,我刚刚尝试了发布配置+发布db连接部署到beta网站=相同的错误。 - JK.
显示剩余4条评论
4个回答

20

今天我在将实现linq to entity 4的Web应用程序部署到我们的QA环境时遇到了这个问题。问题最终被证明是Windows 2008 R2服务器上的IIS设置问题。在应用程序池的高级设置下,启用32位应用程序的设置被设置为False。我将其设置为True,现在我的应用程序与开发服务器(恰好是Windows 2003服务器)一样正常工作。希望这有所帮助。


+1 很好的发现,看起来已经解决了问题!现在如果我所有的项目都编译为 Any CPU,那么到底是什么在尝试以 32 位运行?Entity Framework 本身是在尝试以 32 位运行吗?我需要进行全面测试,但看起来赏金会流向你的方向 :) - JK.
谢谢。我一定会感激的。我花了半天时间追踪这个问题。 - Rick
非常感谢您。我花了好几天时间在一些服务器上运行我的应用程序时进行故障排除,但在其他服务器上却没有问题。 - Nick
谢谢,今天我们遇到了相反的情况,需要关闭32位模式而不是打开,因为我们之前已经进行过一次修复。这对我们非常有帮助。 - TechLiam

2

对我而言,这是当我在实体模型中添加一个视图之后发生的。默认情况下,设计师将所有列的 Entity Key 属性设置为 true。当我将所有十进制/数字列的属性设置为 false 时,错误便消失了。


1

你尝试在另一台机器上部署beta配置了吗?你的应用程序池设置是否相同(即classic vs integrated,相同的.net版本)?你尝试清理解决方案并重新部署到新位置了吗?你尝试将beta构建部署到发布位置了吗?(确保在发布之前删除所有文件;我想知道是否有残留的动态加载依赖项可能会导致问题)

更新:

非常感谢提供更多信息。在第3行,您正在定义变量page,同时还使用先前定义的名为page的变量。这怎么编译的?尝试注释掉该代码或至少尝试不跳过它。

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

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


应用程序池是相同的,我已经尝试了多次清理、重建和部署(并在部署之前删除文件)。当我将每个项目都设置为以任何 CPU 部署时,就会出现这种情况,因此与构建无关。可能是 Entity Framework 中的某些问题? - JK.
更新了问题的更多细节。我在服务器上安装了Visual Studio,找到了导致问题和堆栈跟踪的实际行。 - JK.
哎呀——关于第三行,那是个笔误,应该写成paged——另一个变量是int page,它只是要检索的页面数量。我会查一下计数与取值是否会重复执行查询操作,谢谢。 - JK.

0

有一个重大的错误!!我认为这是在Entity Framework中具有小数字段列属性时出现的。

我遇到了这个讨厌的错误消息,我比较了从两个不同的表(相同的表)获取数据,一个带有整数列ID,另一个带有小数列ID。

对于具有整数列的表,没有问题,同样的代码运行得很完美, 对于具有小数列的表,会弹出此错误消息。 我已经检查了SQL Server IIS和环境,甚至想要格式化PC, 这非常奇怪,错误消息也不清楚。

希望这种方法能帮助未来遇到此类错误的人。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接