0

データベースにデモデータをシードするために実行されるコードが1つありますがApplication_Start、次のような例外が発生します。

ObjectContextインスタンスは破棄され、接続が必要な操作には使用できなくなりました

私のエンティティの1つを列挙しようとしている間DB.ENTITY.SELECT(x => x.Id == value);

コードを確認しましたが、操作の前にコンテキストを破棄していません。現在の実装の概要は次のとおりです。

protected void Application_Start()
{
   SeedDemoData();
}

public static void SeedDemoData()
{
   using(var context = new DBContext())
   {
       // my code is run here.
   }
}

Application_Startそのため、タイムアウトして、dbコンテキストが完了する前に接続を強制的に閉じるかどうか疑問に思いました。

注:コードは別の場所で使用しており、単体テストが行​​われており、問題なく動作するため、コードを知っています。

ここで問題になる可能性のあるアイデアはありますか?または私が欠けているもの?

4

1 に答える 1

1

問題を調査して数時間後、別のスレッドで保留中の変更があるデータコンテキストが原因であることがわかりました。データベースのアップグレード/移行の現在の実装は、App_Startメソッドとの並列スレッドで実行されるため、列挙しようとしているエンティティが同時に変更されていることに気付きました。EFは、異なるデータコンテキストで実行されていることに気づいています。エンティティへのアクセス中に問題が発生し、データコンテキストが破棄されたという誤ったエラーメッセージが返されましたが、実際の例外は、エンティティの状態が変更されたが保存されていないことです。

私の問題の実際の解決策は、すべてのシードデータ関数をデータベースのアップグレード/移行スクリプトに移動して、エンティティが一度に1か所でのみ変更されるようにすることでした。

于 2013-03-11T20:48:51.083 に答える