“这种关系无法改变,因为一个或多个外键属性是不可为空的...”

时间:2013-05-14 20:25:44

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

保存上下文时出现以下错误:

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

控制器代码:

#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

模型结构:

项目1 - &gt; *第1组 - &gt; *用户代理

我可以通过删除以下声明来阻止错误发生:

Project _Project = _Db.Projects.First(p => p.Owner.ToLower() == _Username);
ProjectGroup _Group = _Db.Groups.First(g => g.GroupID == story.GroupID);

但是我需要进行这些检查以确保用户属于项目等。我真的没有看到导致错误的原因,这些语句都没有对要保存的数据产生影响吗? / p>

1 个答案:

答案 0 :(得分:1)

一切都在您的模型设计中。如果您明确声明了您的外键属性,请按以下方式执行:

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 FirstDatabase First

,这应该有效