14

私はEntity Frameworkが初めてなので、ご容赦ください。

テーブルから複数のレコードを選択してキューに保存するプログラムがあります。

private Queue<RecordsToProcess> getRecordsToProcess()
{
    Queue<RecordsToProcess> results = new Queue<RecordsToProcess>();
    using (MyEntity context = new MyEntity())
    {
        var query = from v in context.RecordsToProcess
                            where v.Processed == false
                            select v;

        foreach (RecordsToProcess record in query)
        {
            results.Enqueue(record);
        }
    }
}

次に、複数のワーカー スレッドを起動します。各ワーカー スレッドは、キュー内のアイテムの 1 つを取得して処理し、データベースに保存します。

private void processWorkerThread(object stateInfo)
{
    while (workQueue.Count > 0)
    {
        RecordToProcess record = new RecordToProcess;
        lock(workQueue)
        {
            if (workQueue.Count > 0)
                RecordToProcess = workQueue.Dequeue();
            else
                break;
        }

        //Do the record processing here

        //How do I save that record here???
    }
}

私の理解では、変更をデータベースに保存するには context.SaveChanges() を呼び出すだけですが、この状況ではそれを行うことはできませんか?

どんな助けでも大歓迎です。

ありがとう!

4

2 に答える 2

12

MyEntity最初のメソッドで (ステートメントでラップすることにより) コンテキストを破棄usingしているため、キューに入れられたエンティティは「切り離された」状態になります。つまり、とりわけ、エンティティに対して行われた変更は追跡されず、ナビゲーション プロパティを遅延読み込みできなくなります。

これらのエンティティをデキューし、別のコンテキストに「アタッチ」して更新し、呼び出しSaveChangesて変更を永続化することはまったく問題ありません。

オブジェクトのアタッチとデタッチおよび追加/アタッチとエンティティ状態について読むことができます

于 2013-01-28T22:47:20.663 に答える
2

代わりに主キーをキューに保存し、エンティティを再度取得する方が安全な場合があります。このようにして、データの同時実行の問題を回避する可能性が高くなります。

于 2013-01-28T22:47:00.347 に答える