2013-05-30 4 views
3

У меня есть пример приложения 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); 
} 

Что мне здесь не хватает?

ответ

2

Речь идет о последней части, за исключением:

or the unrelated object must be deleted

Похоже, в вашем методе EditPlayer s удаляются из team.Players (или, возможно, даже очищен полностью из-за сбоев копирования). Но, слишком плохо, вы не можете просто удалять элементы из дочерней коллекции, если внешний ключ не имеет значения NULL (видимо, игроки не могут существовать без команды). Вы должны удалить удаленных игроков из контекста.

Таким образом, вы должны обнаружить игроков, которые удаляются из команды, и для каждого из них называют

context.Players.Remove(player); 
+0

Спасибо за быстрый ответ Герт. Я не уверен, как игроки будут удалены из коллекции, даже не касаясь ни одной строки игрока при редактировании записей команды. Я также не знаю, где и как добавить эту строку кода, которую вы предложили обнаружить и удалить удаленных игроков, поскольку я новичок в MVC. Я действительно ценю твою помощь. – corix010

+0

Думаю, вам придется искать в отладчике то, что происходит с командой team.Players, когда вы проходите процедуру 'Edit'. –

+0

Я отлаживаю, и там нет ничего, что подсказывает, что игроки удаляются. Фактически, количество игроков согласовано как в объектах domain, так и в viewmodel. – corix010

Смежные вопросы