1

確かにあなたは以下のエラーが発生する理由を知っています

同じキーを持つオブジェクトが 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」(エンティティ)全体を一度に設定し、個別に設定する必要はありません

4

1 に答える 1

0

.Localエンティティを見つけるためのコードはありますが、エンティティが以前にデータベースからフェッチされているか、現在のセッションの他の場所にアタッチされている場合にのみ機能することに注意してください。

var attachedEntity = leitner.Set<Person>().SingleOrDefault(x => x.Id == 3);

Remove方法がありますDbSet

leitner.Set<Person>().Remove(attachedEntity);

そして、から返されるSetValuesメソッドDbEntityEntry<Person>leitner.Entry(attachedEntity)

var p2 = new Person() // for update
    {
        Id = 3,
        Name = "W",
        Family = "W",
        Age = 90
    };
leitner.Entry(attachedEntity).Currentvalues.SetValues(p2);
于 2013-11-05T10:55:40.460 に答える