У меня есть пример приложения MVC 4, используя сначала код (POCO), EF, ViewModels и AutoMapper. Я создал контроллер, где родительский элемент и соответствующие дочерние сущности находятся на одном представлении (объект с вложенным набором дочерних объектов). Выглядит хорошо, пока у меня нет проблем с обновлением записей. Я получаю следующее сообщение об ошибке:Automapper - ошибка обновления вложенной детской коллекции
The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.
Я искал в Интернете в течение многих дней, теперь пробуя различные решения, но не мог заставить его работать.
У меня есть следующие модели домена:
public class Team
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Player> Players { get; set; }
}
public class Player
{
public int Id { get; set; }
public string Name { get; set; }
public int TeamId { get; set; }
public virtual Team Team { get; set; }
}
И соответствующие ViewModels:
public class TeamVM
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<PlayerVM> Players { get; set; }
}
public class PlayerVM
{
public int Id { get; set; }
public string Name { get; set; }
public int TeamId { get; set; }
public virtual TeamVM Team { get; set; }
}
Мой отображение выглядит следующим образом:
Mapper.CreateMap<Player, PlayerVM>();
Mapper.CreateMap<PlayerVM, Player>();
Mapper.CreateMap<Team, TeamVM>();
Mapper.CreateMap<TeamVM, Team>();
Моя команда контроллер редактировать действие выглядит следующим образом :
[HttpPost]
public ActionResult Edit(TeamVM teamVM)
{
if (ModelState.IsValid)
{
Team team = context.Teams.Find(teamVM.Id);
Team updatedTeam = Mapper.Map<TeamVM, Team>(teamVM, team);
context.Entry(team).CurrentValues.SetValues(updatedTeam);
context.SaveChanges();
return RedirectToAction("Index");
}
return View(teamVM);
}
Что мне здесь не хватает?
Спасибо за быстрый ответ Герт. Я не уверен, как игроки будут удалены из коллекции, даже не касаясь ни одной строки игрока при редактировании записей команды. Я также не знаю, где и как добавить эту строку кода, которую вы предложили обнаружить и удалить удаленных игроков, поскольку я новичок в MVC. Я действительно ценю твою помощь. – corix010
Думаю, вам придется искать в отладчике то, что происходит с командой team.Players, когда вы проходите процедуру 'Edit'. –
Я отлаживаю, и там нет ничего, что подсказывает, что игроки удаляются. Фактически, количество игроков согласовано как в объектах domain, так и в viewmodel. – corix010