2

この例外を分析しようとしています。

メッセージ: エラー: オブジェクト参照がオブジェクトのインスタンスに設定されていません.. Z.Services.ObjectContextManagement.ScopedObjectContextManager 2.Manage()の System.Activator.CreateInstanceT で System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache) で System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache) を使用1.get_ObjectContext() at Z.Services.DatabaseAccess.DatabaseAccessします。 Services.DatabaseAccess.DatabaseAccess`2.get_ObjectContext()

基本的に、ObjectContext を取得するときにエラーが発生します。

この質問から: Entity Framework の遅延読み込みは他のスレッドからは機能しません。EFは同じスレッドにとどまることに依存していることがわかります。

この Jon Skeet のこの質問に対する回答から: IIS での要求は単一のスレッドで実行されますか? IIS にはスレッドの機敏性があることがわかります。

トラフィック量が少ない場合、このエラーは表示されませんが、負荷が増加するとエラーが表示されます。

質問: EF が 1 つのスレッドにとどまることに依存しており、IIS が要求を 1 つのスレッドに保持しない場合、IIS にデプロイされたアプリケーションで EF を使用できますか?

編集

var frameworkAssembly = Assembly.GetAssembly(typeof(ObjectContextManager<>));
var managerType = frameworkAssembly.GetType(managerTypeName + "`1", true, true);
managerType = managerType.MakeGenericType(typeof(TObjectContext));
ObjectContextManager = Activator.CreateInstance(managerType) as ObjectContextManager<TObjectContext>;

上記のコードの最後の行でエラーが発生しているようです。このエラーは、負荷が高い本番環境でのみ発生します。

編集 2

ObjectContextManager は、EF クラスである ObjectContext から継承します。

 public abstract class ObjectContextManager<T> where T : ObjectContext
4

1 に答える 1

3

最近、スレッドの機敏性と IIS でいくつかの問題に遭遇しました。IIS は、要求がパイプラインを通過するときに、要求のスレッドをシフトできます。これは、並行性をより意識する必要があるという意味ではありません。重要なのは、コンテキスト データをスレッドにアタッチする方法です。

ASP.NET 環境では、このストレージはHttpContent.Current、現在のスレッドで処理されている現在の要求の詳細を保持する変数を介して行われます。System.Runtime.Remoting.Messaging.CallContext.HostContext変数を介してこれを行います。

スレッドごとにデータを保持するための多くのソリューションはThreadStatic属性を利用しますが、これはスレッド スイッチのために ASP 環境では失敗します。スレッドの静的は最初は評価され、その後null、処理パイプラインの途中にあるように見えます。

HttpContextASP.NET は、CurrentPrincipal、 、場合によってはロケールも追跡します。CallContextデータとThreadStatic変数に格納されたデータはコピーされません。

答えは、いらいらさせられますが、戦略を変更し、HttpContext.Current.Items代わりにCallContextまたはスレッドの静的を使用することです。

あなたの場合、EF に使用されている戦略を確認し、実装がプラグイン可能かどうかを確認してください。

Jon Skeet が指摘しているように、Cup(Of T)でより多くの情報を入手できますが、これはそれ自体が目的ではなく、発見の出発点として使用してください。

于 2012-10-15T12:26:22.713 に答える