1

私はEF4.2を使用していますが、非常にランダムに警告なしに発生する問題があります。データベースを更新するWindowsサービスがあります。サービスではタイマーがあります。タイマーの時間が経過すると、メソッドが呼び出されます。これがメソッドの基本構造です

IEnumerable<Foo> foos = GetFoosFromDB();
foreach (Foo foo in foos)
{
    if (some condition)
    {
        foo.Bar = 1;
    }
    if (some other condition)
    {
        foo.Bar = 2;
    }

    if (yet some other condition)
    {
        foo.Bar = 3;
    }
    else
    {
       int val = GetSomeValueFromDB();

        if (val == something)
        {
            if(GetSomeOtherValueFromDB())
            {
                foo.Bar = 4;
            } 
            else
            {
                CallSomeMethodThatAlsoCallsSaveChanges();
                foo.Bat = SomeCalculatedValue();
            }
        }
    }
}
SaveChanges();

ここで問題となるのは、データベースで1日作業を開始し、そのデータベースのテーブルに数行があると(100行または200行のみについて話している)、このメソッドが呼び出されても、そうではないということですSaveChanges。 tはそれがすべきことをしているようです。私は何が間違っているのですか?

ありがとう、

サチン

4

1 に答える 1

1

コードの他の側面を無視すると、この行は問題の可能性として突き出ていました。

else
{
      CallSomeMethodThatAlsoCallsSaveChanges();
      foo.Bat = SomeCalculatedValue();
}
// a few }} later...
SaveChanges();

このロジックブランチが実行されると、コンテキストの保留中の変更がDBにコミットされます(提供した内容に基づいて)。dbコンテキストオブジェクトを作成および管理する方法に応じて、変更されたリストをクリアするか、変更の競合が発生する可能性があります。がSaveChanges()ループの後に呼び出されると、コミットする保留中の変更がある場合とない場合があります(条件付きロジックが他のメソッドを呼び出したかどうかによって異なります)。

このロジックで実行されている作業の論理ユニットを検討し、それらのUoWをアトミックに分離してください。DBコンテキストはオブジェクトのローカル状態を維持するため、DBコンテキストがどのように作成、管理、および受け渡されるかを考えてください。

それでも問題が解決しない場合は、コードをさらに投稿して、さらにトラブルシューティングを試みることができます

于 2012-07-18T17:17:29.283 に答える