web-dev-qa-db-ja.com

多対多のエンティティフレームワークの削除

ArtistArtistTypeの間には多対多の関係があります。以下のように簡単にアーティストArtistTypeを追加できます

foreach (var artistType in this._db.ArtistTypes
    .Where(artistType => vm.SelectedIds.Contains(artistType.ArtistTypeID)))
{
    artist.ArtistTypes.Add(artistType);
}

_db.ArtistDetails.Add(artist);
_db.SaveChanges();

これにより、多対多の関連付けテーブルが正しいマッピングで更新されます。しかし、テーブルからアイテムを削除しようとすると、エラーは発生しませんが、テーブルからは削除されませんか?

foreach (var artistType in this._db.ArtistTypes
    .Where(at => vm.SelectedIds.Contains(at.ArtistTypeID)))
{
    artistDetail.ArtistTypes.Remove(artistType);
}

this._db.Entry(artistDetail).State = EntityState.Modified;
this._db.SaveChanges();

何が欠けていますか?

22
akd

標準的な方法は、アーティストをロードすることですinclude現在の関連タイプをデータベースから選択し、ロードされたタイプコレクションから選択されたIDを持つタイプを削除します。変更追跡は、削除されたタイプを認識し、正しいDELETEステートメントを結合テーブルに書き込みます。

var artist = this._db.Artists.Include(a => a.ArtistTypes)
    .SingleOrDefault(a => a.ArtistID == someArtistID);

if (artist != null)
{
    foreach (var artistType in artist.ArtistTypes
        .Where(at => vm.SelectedIds.Contains(at.ArtistTypeID)).ToList())
    {
        artist.ArtistTypes.Remove(artistType);
    }
    this._db.SaveChanges();        
}
45
Slauma