更新实体和子实体列表之间的键?
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();
我在 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();