確かにあなたは以下のエラーが発生する理由を知っています
同じキーを持つオブジェクトが ObjectStateManager に既に存在します。ObjectStateManager は、同じキーを持つ複数のオブジェクトを追跡できません。
更新または削除したい私のエンティティ
var p = new Person() // for delete
{
Id = 3,
Name = "A",
Family = "A",
Age = 10
};
var p2 = new Person() // for update
{
Id = 3,
Name = "W",
Family = "W",
Age = 90
};
私の目標は以下のコードを使用することですが、上記のコードを使用するとエラーが発生します
var attachedEntity = leitner.Set<Person>().Attach(p); // maybe not needed !!! according to @oerkelens comment
leitner.Entry(attachedEntity).State = EntityState.Deleted; // for delete
leitner.Entry(attachedEntity).State = EntityState.Modified; // for update
leitner.SaveChanges();
したがって、以下のコードのように変更する必要があります
var attachedEntity = leitner.Set<Person>().Local.SingleOrDefault(x => x.Id == 3);
attachedEntity.Name = "W"; // for update
attachedEntity.Family = "W";// for update
attachedEntity.Age = 90;// for update
leitner.Entry(attachedEntity).State = EntityState.Deleted;// for delete
leitner.Entry(attachedEntity).State = EntityState.Modified;// for update
leitner.SaveChanges();
新しいコードは機能しますが、2 つの問題があります
最初 : ID を簡単に検索する必要があります
SingleOrDefault(x => x.Id == 3) // for update or delete
2番目:プロパティに値を1つずつ設定する必要があります
attachedEntity.Name = "W"; // for update
attachedEntity.Family = "W";// for update
attachedEntity.Age = 90;// for update
自分のエンティティをattachedEntityに割り当てることができません
attachedEntity = p; // does not work same error as above occures
attachedEntity = p2; // does not work same error as above occures
私の目標にアクセスするために私を導いてください
私の目標は次のようなものです:
var attachedEntity = leitner.Set<Person>().Attach(p); // may be not needed !!!
leitner.Entry(attachedEntity).State = EntityState.Deleted; // if only use this line above error occures again
leitner.Entry(attachedEntity).State = EntityState.Modified; // if only use this line above error occures again
leitner.SaveChanges();
「p」(エンティティ)全体を一度に設定し、個別に設定する必要はありません