0

リレーションシップコレクションICollectionClubUsersを持つClubItemオブジェクトがあります。コンテキストからClubItemをロードし、CluItemに数人の新しいユーザーを追加します。ClubItemを切断された状態で保存すると、コンテキストは新しいClubUsersを新しいエンティティとして認識しません。何かが変わったことをコンテキストに伝える方法は?私はすでにこれを使用してClubItemのentitystateを変更しています。

    public virtual void Update(IEntity entityToUpdate)
    {
        DbSet.Attach(entityToUpdate);
        Context.Entry(entityToUpdate).State = EntityState.Modified;

        SaveChanges();
    } 
4

1 に答える 1

2

特定のケースでは、おそらくAttach行を削除するだけです。Attachオブジェクトグラフ内の他の切り離されたエンティティを含む切り離されたエンティティを状態にしUnchangedます。状態を変更するModifiedと、親エンティティにのみ影響し、子はまだ状態のままUnchangedです。電話をかけるとSaveChanges、状態がであるため、子は保存されませんUnchanged

呼び出しを行わない場合、EFが呼び出されるまで子はAttach切り離されたままになります。EFは、子SaveChangesが新しいエンティティであると見なし(コンテキストに接続されていないため)、状態をに設定しAddedます。次に、それらはデータベースに挿入されます。

ただし、Attach行を削除すると、メソッドを使用して既存の親と既存の子の間の関係を更新できなくなります。

一般に、デタッチされたエンティティに変更されたエンティティの子コレクションが含まれている場合、エンティティが削除された場所を追加すると、通常、データベースから元のオブジェクトグラフを再読み込みし、変更をマージする必要があります。複雑なデタッチオブジェクトグラフのこのような更新は、一般的な方法では機能せず、エンティティタイプ固有のコードが必要になります。例はここにあります:https ://stackoverflow.com/a/5540956/270591

于 2012-06-17T23:30:16.637 に答える