6

私のWindowsサービスは.NETアプリケーションです。このサービスは、EF4.3コードファーストを使用する私のデータアクセスに依存しています。サービスを実行してデータにアクセスしようとすると、次のエラーが発生します。

FullPurgeAndReplace()でエラーが発生しました:System.InvalidProgramException:共通言語ランタイムが無効なプログラムを検出しました。at System.Data.Entity.DynamicProxies.MOMInventoryItem_3ED5D5176D2C03867C62DD8E4381A882350CFD9CD931F3CD551623A6EF5C4D8E.set_Id(Decimal)at lambda_method(ElementOnly[Closure、Shaper)at System.Data.Common.Internal.Materialization .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のそのWebサイトでは、それぞれのアプリケーションプールに対して[32ビットアプリケーションを有効にする]がオンになっています。

問題を調査したところ、エラーのエンティティ(MOMInventoryItem)に10進数の主キーがあるという事実に関連している可能性があることがわかりました。既存のシステムと統合しているので仕方がありません。ただし、これは1年以上前のEF 4.0の既知の問題であり、これで解決されると思います。

これが私のエンティティからのコードです:

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

繰り返しますが、これはIISでホストされているMVCアプリを介して正常に機能しますが、同じWindows2008R2サーバー上でWindowsサービスとして失敗します。それは私のDEVマシン(Win7 / VS11)でも動作します。 私の問題は何ですか?それを恒久的に解決するか、回避するにはどうすればよいですか?

いつものように、助けは非常に高く評価され、可能な場合は往復します。

4

2 に答える 2

2

スタートアッププロジェクトを32ビットをターゲットに設定してみてください。これにより、明らかな64ビットの問題を防ぐことができます。そして、MVCで正常に動作する理由を説明してください。

于 2012-09-13T17:31:34.430 に答える
0

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

-

問題の回避策を見つけました。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としてマークされているため、問題はないと思います。

Any CPUではなくx86をターゲットにすると、それが解決される可能性があると思います。@ leppieの提案に従って、次にそれを試してみます。

それでも、なぜこれがこのタイプのエラーを表示するのか知りたいのですが、共通言語ランタイムが無効なプログラムを検出しました。

于 2012-09-13T14:42:57.660 に答える