6

我的 Windows 服务是一个 .NET 应用程序。该服务依赖于我使用 EF 4.3 Code First 的数据访问。当我的服务运行并尝试访问数据时,我收到以下错误。

FullPurgeAndReplace() 中发生错误:System.InvalidProgramException:公共语言运行时检测到无效程序。at System.Data.Entity.DynamicProxies.MOMInventoryItem_3ED5D5176D2C03867C62DD8E4381A882350CFD9CD931F3CD551623A6EF5C4D8E.set_Id(Decimal ) at lambda_method(Closure , Shaper ) at System.Data.Common.Internal.Materialization.Shaper.HandleEntityAppendOnly[TEntity](Func 1.ReadNextElement(Shaper shaper) at System .Data.Common.Internal.Materialization.Shaper 1..ctor(IEnumerable 1 source) ... 删除更多2 constructEntityDelegate, EntityKey entityKey, EntitySet entitySet)
at lambda_method(Closure , Shaper ) at System.Data.Common.Internal.Materialization.Coordinator
1.SimpleEnumerator.MoveNext() at System.Collections.Generic.List1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable

在同一台机器上,我有一个 Web 应用程序,它依赖于同一个数据访问项目并且运行没有问题。对于 IIS 中的那个网站,我确实为相应的应用程序池选中了启用 32 位应用程序。

我研究了这个问题,发现它可能与错误中的实体(MOMInventoryItem)具有十进制主键这一事实有关。我别无选择,因为我正在与现有系统集成。但是,这应该是一年多前EF 4.0 的一个已知问题,我希望它现在可以解决。

这是我的实体的一些代码:

[Table("STOCK")]
public class MOMInventoryItem
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.None), Column("STOCK_ID")]
    public virtual decimal Id { get; set; }

同样,这可以通过托管在 IIS 中的 MVC 应用程序正常工作,但作为 Windows 服务失败,两者都在同一 Windows 2008 R2 服务器上。它也适用于我的 DEV 机器(Win7/VS11)。 我的问题是什么,我该如何永久解决或解决它?

一如既往,我们非常感谢您的帮助,并在可能的情况下给予回报。

4

2 回答 2

2

尝试将启动项目设置为 32 位,这应该可以防止明显的 64 位问题。并解释为什么它在 MVC 上运行良好。

于 2012-09-13T17:31:34.430 回答
0

注意:在我得到更好的答案之前,以下是对我有用的解决方法。更好的答案是将 Windows 服务项目编译为针对 x86 而不是 Any CPU。这仍然不能回答为什么 Windows Server 2008 R2 与 Win 7 不同,但这是不同日子的不同问题。

--

我找到了解决我的问题的方法。我将我的 Key 更改为 int (因为无论如何这确实是存储在 DB 中的内容,尽管技术上是十进制列)并且我在 Column 属性中明确提供了 TypeName = "Decimal"。

[Table("STOCK")]
public class MOMInventoryItem
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity), Column("STOCK_ID", TypeName = "Decimal")]
    public virtual int Id { get; set; }

就我而言,我从不写信给这张桌子——尽管我将来可能需要这样做。我不能 100% 确定这将如何影响写入行,但由于该列被标记为 DatabaseGenerated,我假设它不会成为问题。

我确实认为如果我以 x86 而不是 Any CPU 为目标,那么它可能会解决它,我会按照@leppie 的建议尝试下一个

尽管如此,我仍然很想知道为什么会出现这种类型的错误——公共语言运行时检测到一个无效程序。

于 2012-09-13T14:42:57.660 回答