1

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

保存更改的控制器代码:

 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();

myRecord类:

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

团队类:

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

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

4

1 回答 1

4

设置Stateto 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();
于 2017-06-22T20:20:43.493 回答