4

このような問題に遭遇したのは初めてで、ウェブ上でそれに関する情報を見つけることができません。

以下のコードはうまくいきます

Exception_Perimetre = dc.Exception_Perimetre
                      .Where(x => x.Con_Con_Id == ConId
                               && x.Exp_Date_Debut <= date 
                               && x.Exp_Date_Fin >= date)
                      .ToArray();

ただし、ランダムに使用すると、次の例外がスローされます。

プロパティ "Exp_Id" から "Exception_Perimetre" を値 "Decimal" に設定できませんでした。このプロパティには、'Guid' 型の null 以外の値を割り当てる必要があります。

元の値の型は Guid ですが、何らかの理由で Entity フレームワークが 10 進数に変換しようとしています...

参考までに、IIS で Windows ID 接続を使用すると、うまく機能します。匿名接続に変更した後、失敗し始めました。この部分が誰かが解決策を見つけるのに役立つことを願っています;)

4

1 に答える 1

2

この問題は、複数のスレッドから同じコンテキストが使用される場合に発生します。DbContext と ObjectContext はスレッド セーフではないため、複数のスレッドで使用しないでください。私の推測では、あなたのコンテキストは StructureMap のような IoC プロバイダーによって返されており、すべてのリクエストに対して同じコンテキストを返すように依存関係が正しく設定されていません。

認証が Windows ID に設定されているのに、なぜこれが機能したのですか? 使用されている接続文字列は基本的にユーザーごとに異なるため、ユーザー間で同じ開いている接続を共有することはありませんでした。匿名に切り替えると、突然各ユーザーが同じように見えたため、コンテキストは同じ共有接続プールを共有することになりました。

これが断続的にしか表示されない理由は、マルチスレッドの問題のためです。基本的に何が起こっていたかというと、コネクションがリクエスト X のリーダーを返しているが、リクエスト Y によって消費されているということでした。リクエスト Y は列の序数 1 が Guid であると予想していましたが、リクエスト X の列は 10 進数です。

繰り返しますが、修正は IoC 構成に対処することであると思いますが、コンテキストのインスタンスを返すことです。

それが問題を解決するのに役立つことを願っています。

于 2013-02-12T13:23:43.190 に答える