12

私がやりたいのは簡単です。データベースにパーツのリストがあり、更新リストに従ってそれらを削除/挿入/更新したいと思います。

主な問題は、エントリを置き換えたいときに、古い(更新される)エントリがすでに(以前の読み取り呼び出しによって)アタッチされており、例外がスローされるため、コンテキストにアタッチできないことです。

私は3つの考えを思いついた。

  1. 古いエントリを手動でデタッチし、新しいエントリをアタッチします(ただし、エンティティの状態をデタッチに変更しても例外がスローされます)
  2. 古いエントリの値を新しいエントリに手動で変更します
  3. 読み取り呼び出しを追跡不可(AsNoTracking())にします。これは正常に機能しているようですが、遅延読み込みへの影響が心配です。

「context.entry.replace(oldEntry、newEntry)」やその他の適切な方法でこれを行う機能はありますか?

IEnumerable<SoldPart> old = db.SoldParts.Where(sp=>sp.sessionId == sessionId);

                var toDelete = old.Where(po=> !parts.Any(pu=>pu.id == po.id));
                var toCreate = parts.Where(po => !old.Any(pu => pu.id == po.id));
                var toUpdate = parts.Where(po => old.Any(pu => pu.id == po.id));


                foreach (SoldPart item in toDelete)
                {
                    db.SoldParts.Attach(item);
                    db.SoldParts.Remove(item);
                }
                foreach (SoldPart item in toCreate)
                {
                    db.SoldParts.Add(item);
                }

                foreach (SoldPart item in toUpdate)
                {

                    db.SoldParts.Attach(item);
                    db.Entry(item).State = EntityState.Modified;
                }


                db.SaveChanges();
4

1 に答える 1

35

アタッチされたエンティティの値をデタッチされたエンティティから自動的に更新する方法がありますが、それはスカラー/複雑なプロパティでのみ機能します。ナビゲーションプロパティではありません:

deb.Entry(oldEntry).CurrentValues.SetValues(newEntry);
于 2013-01-23T09:13:53.923 に答える