私がやりたいのは簡単です。データベースにパーツのリストがあり、更新リストに従ってそれらを削除/挿入/更新したいと思います。
主な問題は、エントリを置き換えたいときに、古い(更新される)エントリがすでに(以前の読み取り呼び出しによって)アタッチされており、例外がスローされるため、コンテキストにアタッチできないことです。
私は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();