删除多个到多个实体框架

akd*_*akd 21 c# many-to-many entity-framework dbcontext

Artist和之间存在着多对多的关系ArtistType.我可以轻松添加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();
Run Code Online (Sandbox Code Playgroud)

这将使用正确的映射更新多对多关联表.但是,当我尝试从表中删除任何项目时,我没有得到任何错误,但它没有从表中删除它?

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();
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

Sla*_*uma 43

标准方法是从数据库加载包括当前相关类型的艺术家,然后从加载的类型集合中删除具有所选Ids的类型.更改跟踪将识别已删除的类型,并将正确的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();        
}
Run Code Online (Sandbox Code Playgroud)

  • 这不是浪费,因为当您真的只需要 id 时,您正在完全加载所有子 ArtistType。 (3认同)
  • 是否可以只加载您关心的给定艺术家的艺术家类型?我有一种情况,当我只想删除一个关联时,它会加载数千种“艺术家类型”。 (3认同)