4

State設定すると、データベース内のエンティティを更新するプロパティがあります。

問題は、このプロパティが複数のスレッドにまたがって設定されており、ジョブ フィールドが同時に 2 つのコンテキストにアタッチされることがあり、次の例外が発生することです。

エンティティ オブジェクトは、IEntityChangeTracker の複数のインスタンスによって参照できません。

ステートメントの周りにロックを使用しようとしましたusingが、これは機能しません:

private Job job;

public string State 
{
    get
    {
        return job.State;
    }
    set
    {
        lock (job)
        {
            using (MyEntities context = new MyEntities())
            {
                context.Jobs.Attach(job);
                job.State = value;

                context.SaveChanges();
            }
        }
    }
}

これについて最善の方法は何ですか?

4

2 に答える 2

1

オブジェクトをデタッチしても問題がなく、何も失うことがない場合は、保存後にコンテキストからデタッチできます。

lock (job)
{
     using (MyEntities context = new MyEntities())
     {
           context.Jobs.Attach(job);
           job.State = value;
           context.SaveChanges();
           context.Detach(job);  // Detach the object
      }
}

アップデート:

私はすでに同様のシナリオをテストしましたが、問題は見つかりませんでした。エンティティjobがクリティカル セクションに入る前に何らかのコンテキストに関連付けられたのではないかと考えています。いくつかの関係がある場合、 http://blogs.msdn.com/b/alexj/archive/2009/06/08/tip-24-how-jobで提案されている方法を使用して、エンティティが何らかのコンテキストに関連付けられているかどうかを確認できます。to-get-the-objectcontext-from-an-entity.aspx

于 2013-10-03T08:42:22.717 に答える