Automapper - 更新嵌套子集合时出错

时间:2013-05-30 20:45:48

标签: entity-framework asp.net-mvc-4 viewmodel automapper

我有一个使用代码优先(POCO),EF,ViewModels和AutoMapper的MVC 4示例应用程序。我创建了一个控制器,其中父级和相应的子实体位于同一视图中(具有嵌套的子实体集合的实体)。 到目前为止看起来不错,除了我有更新记录的问题。我收到以下错误:

  

操作失败:无法更改关系,因为   一个或多个外键属性是不可为空的。当一个   改变了关系,相关的外键属性是   设置为空值。如果外键不支持空值,   必须定义新的关系,外键属性必须是   分配了另一个非空值,或者不相关的对象必须是   删除。

我一直在网上搜索很多天,​​现在尝试不同的解决方案,但无法使其正常工作。

我有以下域名模型:

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

我在这里缺少什么?

1 个答案:

答案 0 :(得分:2)

这是例外的最后一部分:

  

或必须删除不相关的对象

您的Edit方法Player似乎已从team.Players中移除(或者甚至可能因复制失败而被清除)。但是,太糟糕了,如果外键不可为空,你不能只从子集合中删除项目(显然,如果没有团队,玩家就不能存在)。您必须从上下文中删除已删除的玩家。

因此,您必须检测从团队中移除的玩家,并为每个玩家调用

context.Players.Remove(player);