6

Windowsサービスは.NETアプリケーションです。このサービスは、EF 4.3 Code Firstを使用するデータアクセスに依存しています。サービスが実行され、データにアクセスしようとすると、次のエラーが発生します。 FullPurgeAndReplace()で発生したプロダクト(Win2008R2/64bit)ではなく、Dev(Win7/64bit)で10進数が動作します。共通言語ランタイムで無効なプログラムが検出されました

エラー: System.InvalidProgramException:共通言語ランタイムは 無効なプログラムを検出しました。 System.Data.Common.Internal.Materialization.Shaper.HandleEntityAppendOnly [TEntity](機能2 constructEntityDelegate, EntityKey entityKey, EntitySet entitySet)
at lambda_method(Closure , Shaper) at System.Data.Common.Internal.Materialization.Coordinator
1.ReadNextElement(シェイパーでlambda_methodで System.Data.Entity.DynamicProxies.MOMInventoryItem_3ED5D5176D2C03867C62DD8E4381A882350CFD9CD931F3CD551623A6EF5C4D8E.set_Id(小数点 )(閉鎖、シェイパー)で同じマシン上で シェイパー) 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ソース)で... より取り外した

は私が依存したWebアプリケーションを持っています同じデータアクセスプロジェクトで問題なく実行されます。IISのWebサイト私は32ビットアプリケーションを有効にして、それぞれのアプリケーションプールをチェックしています。

私はこの問題を調査し、エラーのエンティティ(MOMInventoryItem)に小数の主キーが含まれているという事実に関連している可能性があることを発見しました。私は既存のシステムと統合しているので選択肢はありません。しかし、それはおそらく1年以上前からのknown issue with 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)でも動作します。私の問題は何ですか?どうすれば解決できますか?

いつも助けは非常に高く評価され、可能な限り往復する。

+2

私も65ビットOSを実行したいと思います。この獣をどこで見つけることができますか? Best Buyは64ビットWindowsのみを搭載しています。ええ。私は余分なビットが必要です! –

+0

LOL、うん、私はタイトルを訂正した、ありがとうDan - o! – kingdango

+0

Aw man。ちょうどタイプミス!あなたはデジタルイルミナティで何らかの秘密の社会を持っていたと思って、最初の誕生日を余分に売ってしまったとか... :) –

答えて

2

起動プロジェクトをターゲット32ビットに設定してみてください。これは明らかな64ビット問題を回避するはずです。 MVCで正常に動作する理由を説明してください。

+1

これで問題は解決しました。私はまた、このより良い答えに先立って私のために働いた回避策を掲載しました。私は$ 5を支払うだろう:)誰かに私がWindows 7 64ビット版とIIS版では同じWin 2008 RC2サーバーでうまく動作する理由を私に明確に教えてもらうために、Windowsサービスとしてではない。 – kingdango

0

注:以下は私がより良い答えを出す前に私のために働いた回避策です。より良い答えは、Windowsサービスプロジェクトをコンパイルして、任意のCPUではなくx86をターゲットにすることでした。これはWindows Server 2008 R2がWin 7と異なる理由はまだ解明されていませんが、それは別の問題です。

-

は、私は私の問題の回避策を見つけました。 Keyをintに変更しました。(技術的には10進数ですが、実際には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としてマークされているので、私は問題ではないと仮定しています。

私はそれにもかかわらず、私はまだ、なぜこれがだろう知って好奇心、それは私が代わりに任意のCPUののx86をターゲットならば、それはそれを解決するかもしれないという可能性だと@leppie

により示唆されるように、私は次のことを試してみましょうと思いますこのタイプのエラーが発生しました - Common Language Runtimeが無効なプログラムを検出しました。

+0

'int'の代わりに' long'を使うほうがいいかもしれません、 'decimal'が公開鍵のための良い選択だったとすれば、p – leppie

関連する問題