.net Decimal作为主键在Dev(Win7/64位)中工作,但在生产(Win2008R2/64位)中不工作。公共语言运行库检测到无效程序

.net Decimal作为主键在Dev(Win7/64位)中工作,但在生产(Win2008R2/64位)中不工作。公共语言运行库检测到无效程序,.net,windows-services,ef-code-first,entity-framework-4.3,.net,Windows Services,Ef Code First,Entity Framework 4.3,我的Windows服务是一个.NET应用程序。该服务依赖于我的数据访问,首先使用EF 4.3代码。当我的服务运行并尝试访问数据时,我遇到以下错误 FullPurgeAndReplace()中出现错误: System.InvalidProgrameException:公共语言运行库检测到 无效程序。在 System.Data.Entity.DynamicProxies.MOMInventoryItem_3ED5D5176D2C03867C62DD8E4381A882350CFD9CD931F3CD

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

FullPurgeAndReplace()中出现错误: System.InvalidProgrameException:公共语言运行库检测到 无效程序。在 System.Data.Entity.DynamicProxies.MOMInventoryItem_3ED5D5176D2C03867C62DD8E4381A882350CFD9CD931F3CD551623A6EF5C4D8E.set_Id(十进制) )在lambda_方法(闭包、整形器)处 System.Data.Common.Internal.Materialization.Shaper.HandleEntityAppendOnly[TEntity](函数
2
ConstructionEntityDelegate、EntityKey、EntityKey、EntitySet和EntitySet)
在lambda_方法(闭包、整形器)处 系统、数据、公共、内部、物化、协调器 成型机)在 System.Data.Common.Internal.Materialization.Shaper
1.simplenumerator.MoveNext()
位于System.Collections.Generic.List
1..ctor(IEnumerable
1 collection)
在System.Linq.Enumerable.ToList[TSource](IEnumerable
1 source)中。。。 更多删除

在同一台机器上,我有一个web应用程序,它依赖于同一个数据访问项目,运行时没有问题。对于IIS中的该网站,我已为相应的应用程序池检查了Enable 32位应用程序

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

以下是我的实体中的一些代码:

[Table("STOCK")]
public class MOMInventoryItem
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.None), Column("STOCK_ID")]
    public virtual decimal Id { get; set; }
同样,这可以通过IIS中托管的MVC应用程序正常工作,但作为Windows服务失败,两者都在同一台Windows 2008 R2服务器上。它也可以在我的开发机器(Win7/VS11)上运行。我的问题是什么?我可以如何永久解决它或解决它

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

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

--

我找到了解决问题的办法。我将我的键更改为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为目标,而不是以任何CPU为目标,那么它可能会解决这个问题,我将按照@leppie的建议,尝试下一步


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

尝试将启动项目设置为32位的目标,这样可以防止出现明显的64位问题。并解释为什么MVC运行良好

我也希望运行65位操作系统。我在哪里能找到这只野兽?百思买仅提供64位Windows。嗯。我需要额外的一点!哈哈,是的,我更正了标题,谢谢Dan-o!哦,伙计。只是打字错误!以为你和数字光照派有某种秘密组织,把你的长子卖了一点。。。或者别的什么。:)“我给了我的第一个孩子65位,而我得到的只是这些糟糕的缓存未命中。”尝试将启动项目设置为32位,这应该可以防止明显的64位问题。并解释为什么它在MVC中运行良好。如果有人认为
decimal
是公钥的好选择,那么最好使用
long
而不是
int
;这确实解决了问题。在这个更好的答案出现之前,我还发布了一篇对我有用的文章。我愿意支付5美元:)让某人明确地告诉我为什么这在64位Win 7和同一台IIS下的Win 2008 RC2服务器上运行良好,但不是作为windows服务。