保存上下文时出现以下错误:
操作失败:无法更改关系,因为一个或多个外键属性不可为空。当对关系进行更改时,相关的外键属性被设置为空值。如果外键不支持空值,则必须定义一个新的关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象。
控制器代码:
#region CreateStory
[HttpPost]
[Authorize]
public ActionResult CreateStory(Userstory story)
{
if (ModelState.IsValid)
{
string _Username = User.Identity.Name.ToLower();
using (var _Db = new NimbleContext())
{
Project _Project = _Db.Projects.First(p => p.Owner.ToLower() == _Username);
if (_Project != null)
{
ProjectGroup _Group = _Db.Groups.First(g => g.GroupID == story.GroupID);
if (_Group != null)
{
_Db.Userstories.Add(story);
_Db.SaveChanges(); <--- Error Occurs here!
return Json(new { Success = true, GroupID = _Group.GroupID });
}
}
}
}
return Json(new { Success = false });
}
#endregion
模型结构
Project 1 -> * Groups 1 -> * Userstories
我可以通过删除以下声明来防止错误的发生:
Project _Project = _Db.Projects.First(p => p.Owner.ToLower() == _Username);
ProjectGroup _Group = _Db.Groups.First(g => g.GroupID == story.GroupID);
然而,我需要使这些检查,以确保用户属于项目等。我真的不知道是什么导致了错误,这些语句都不应该对要保存的数据有影响,对吗?
这都在你的模型设计中。如果您显式声明外键属性,请这样做:
public class Project {
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ProjectId { get; set; }
public virtual ICollection<Group> Groups { get; set; }
}
public class Group {
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int GroupId { get; set; }
[ForeignKey("Project"), DatabaseGenerated(DatabaseGeneratedOption.None)]
public int? ProjectId { get; set; }
public virtual Project Project { get; set; }
public virtual ICollection<Userstory> Userstories{ get; set; }
}
public class Userstory {
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int UserstoryId{ get; set; }
[ForeignKey("Group"), DatabaseGenerated(DatabaseGeneratedOption.None)]
public int? GroupId { get; set; }
public virtual Group Group { get; set; }
}
注意:如果您遵循Entity Framework Code First
,不确定Model First
和Database First
等其他方法,则应该可以使用