我有一个使用代码优先(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);
}
我在这里缺少什么?
答案 0 :(得分:2)
这是例外的最后一部分:
或必须删除不相关的对象
您的Edit
方法Player
似乎已从team.Players
中移除(或者甚至可能因复制失败而被清除)。但是,太糟糕了,如果外键不可为空,你不能只从子集合中删除项目(显然,如果没有团队,玩家就不能存在)。您必须从上下文中删除已删除的玩家。
因此,您必须检测从团队中移除的玩家,并为每个玩家调用
context.Players.Remove(player);