1

私はEntityFrameworkコードの最初のアプローチを使用しています。これは、挿入および更新する方法です。

 private void SaveCandidates(Container container, List<Candidate> candidates, bool isInsert)
    {

            var alreadyExists = false;

            foreach (candidate matchingOrderCandidate in candidates)
            {
                alreadyExists = container.Candidates.Any(i => i.Id == candidate.Id);

                if (!alreadyExists && isInsert)
                {
                    container.Entry(candidate).State = EntityState.Added;
                }

                if (alreadyExists && !isInsert)
                {
                    container.Entry(candidate).State = EntityState.Modified;

                }

            }
            container.SaveChanges();
    }

ただし、更新の場合は例外をスローします

[System.InvalidOperationException] = 同じキーを持つオブジェクトが既に ObjectStateManager に存在します。ObjectStateManager は、同じキーを持つ複数のオブジェクトを追跡できません。

最初に候補を挿入し、次にいくつかの自動プロセスが実行され、次にこのメソッドが更新のために呼び出され、更新の場合は で例外が発生しcontainer.SaveChanges()ます。どんな助けでも非常に高く評価されます。

4

1 に答える 1

2

同じ問題はすでにここで解決されているようです同じキーを持つオブジェクトが ObjectStateManager に既に存在します。ObjectStateManager は、同じキーを持つ複数のオブジェクトを追跡できません。 代わりに使用してみてください

container.Entry(candidate).State = EntityState.Modified;

これ:

exist = container.Candidates.FirstOrDefault(i => i.Id == candidate.Id);
if(exist != null) container.Entry(exist).CurrentValues.SetValues(candidate);
于 2012-05-10T19:56:14.150 に答える