更新实体和子实体列表之间的键?

Updating the key between an entity and a list of sub-entities?

我在 ASP.Net MVC 项目中使用 EF6 和 Mapster。在我的 Edit post 控制器中,我试图保存数据输入表单的结果。在窗体上有一个多选列表框。多选列表框中的选择正在正确传递,但我不理解将多选列表中的所选项目保存到数据库的正确方法。使用我在 DisplayName 属性 下方的代码已保存,但未保存 Teams。 (Teams table 与 myRecord table 存在多对多关系)

保存修改的控制器代码:

 var myRecord  = TypeAdapter.Adapt<MyRecord>(myRecordViewModel);
     myRecord.Teams            = db.Teams.Where(a => myRecordViewModel .SelectedTeamIDs.Contains(a.TeamID)).ToList();               
     myRecord.DisplayName      = myRecordViewModel.Name;
     db.Entry(myRecord).State  = EntityState.Modified;
     db.SaveChanges();

我的记录 class:

 public class MyRecord
{
    [Key]
    public int Id { get; set; }
    public string DisplayName { get; set; }
    public virtual ICollection<Team> Teams { get; set; }
}

团队class:

 public partial class Team
{
    public int TeamID { get; set; }
    public string TeamName { get; set; }
    public virtual ICollection<MyRecord> MyRecords{ get; set; }
}

这应该如何保存到数据库中?

State 设置为 Modified(将实体附加到上下文并将所有原始属性标记为已修改)确实适用于简单的场景,但不适用于具有相关数据的情况。

这是执行额外数据库访问的操作序列,但允许 EF 更改跟踪器正确识别应用更改所需的数据库操作:

(1)从数据库中加载原始实体,包括集合 (2) 更新主控信息 (3)用新数据替换集合 (4) 保存

var myRecord = TypeAdapter.Adapt<MyRecord>(myRecordViewModel);
myRecord.DisplayName = myRecordViewModel.Name;
// (1)
var dbRecord = db.MyRecords.Include(x => x.Teams).FirstOrDefault(x => x.Id == myRecord.Id);
// (2)
db.Entry(dbRecord).CurrentValues.SetValues(myRecord);
// (3)
dbRecord.Teams = db.Teams.Where(a => myRecordViewModel .SelectedTeamIDs.Contains(a.TeamID)).ToList();
// (4)
db.SaveChanges();