3

我有一个使用代码优先 (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; }
}

以及相应的视图模型:

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

我在这里想念什么?

4

1 回答 1

2

这是关于异常的最后一部分:

或者必须删除不相关的对象

看起来在您的Edit方法中Players 已被删除team.Players(甚至可能由于复制失败而完全清除)。但是,太糟糕了,如果外键不可为空(显然,没有团队,玩家就不能存在),您不能只从子集合中删除项目。您必须从上下文中删除已删除的播放器。

因此,您必须检测从球队中移除的球员,并为他们每个人打电话

context.Players.Remove(player);
于 2013-05-30T21:08:36.557 回答