Обновление ключа между объектом и списком дочерних объектов?

Я использую EF6 и Mapster в проекте ASP.Net MVC. В моем контроллере редактирования сообщений я пытаюсь сохранить результаты формы ввода данных. На форме есть список с множественным выбором. Выборки в списке списка множественных выборок передаются должным образом, но я не понимаю, как правильно сохранить выбранные элементы в списке множественных выборок в БД. При использовании кода, как он есть ниже, свойство DisplayName сохраняется, но команды не сохраняются. (таблица "Команды" имеет отношение многие ко многим к таблице 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; }
}

Как это должно быть сохранено в базе данных?

1 ответ

Решение

Настройка State в Modified (который присоединяет сущность к контексту и помечает все примитивные свойства как измененные) работает для простых сценариев, но не при наличии связанных данных.

Вот последовательность операций, которая выполняет дополнительное отключение базы данных, но позволяет EF tracker change правильно идентифицировать операции базы данных, необходимые для применения изменений:

(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();
Другие вопросы по тегам