C# 实体框架错误,仅在删除“时”;“多重”;父子行

C# 实体框架错误,仅在删除“时”;“多重”;父子行,c#,sql-server-2012,entity-framework-6,dbcontext,referential-integrity,C#,Sql Server 2012,Entity Framework 6,Dbcontext,Referential Integrity,我正在使用EntityFramework6(代码优先)构建和开发MVC项目 我的数据库数据模型(代码优先): public class ParentNode { public int ParentNodeId { get; set; } public string SomeParentData { get; set; } //FK [Required] public int ChildNodeId { get; set; } public virtual

我正在使用EntityFramework6(代码优先)构建和开发MVC项目

我的数据库数据模型(代码优先):

public class ParentNode
{
   public int ParentNodeId { get; set; }

   public string SomeParentData { get; set; }

   //FK
   [Required] 
   public int ChildNodeId { get; set; }
   public virtual ChildNode ChildNode { get; set; }
}


public class ChildNode
{
   public int ChildNodeId { get; set; }

   public string SomeChildishData { get; set; }

   //References to this table/model
   public virtual ICollection<ParentNode> ParentNodes{ get; set; }
}
错误消息:

public class ParentNode
{
   public int ParentNodeId { get; set; }

   public string SomeParentData { get; set; }

   //FK
   [Required] 
   public int ChildNodeId { get; set; }
   public virtual ChildNode ChildNode { get; set; }
}


public class ChildNode
{
   public int ChildNodeId { get; set; }

   public string SomeChildishData { get; set; }

   //References to this table/model
   public virtual ICollection<ParentNode> ParentNodes{ get; set; }
}
EntityFramework.dll中发生“System.InvalidOperationException”类型的异常,但未在用户代码中处理

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


发生错误时的表行状态

母公司

主键:RestaurantMenuCategoryId

FK:restaurantMenuNameId

孩子

主键:restaurantMenuNameId


正如您所看到的,父表仍然有对子行restaurantMenuNameId==2的引用,而预期的行为是在访问子表之前应该删除父引用

我的观察:

public class ParentNode
{
   public int ParentNodeId { get; set; }

   public string SomeParentData { get; set; }

   //FK
   [Required] 
   public int ChildNodeId { get; set; }
   public virtual ChildNode ChildNode { get; set; }
}


public class ChildNode
{
   public int ChildNodeId { get; set; }

   public string SomeChildishData { get; set; }

   //References to this table/model
   public virtual ICollection<ParentNode> ParentNodes{ get; set; }
}
  • 通过查看数据库,似乎当父节点发生db.SaveChanges()时,即使数据库中没有发生删除查询,代码仍在异步移动。应该使用同步行为,而不是火灾和遗忘
  • 另一种可能性是DbContext在父行删除后不会更新,如果通过查看数据库,父行被删除,但它们“仍然存在”,则可能是这样。那么到底发生了什么
问题:
请让我知道问题是什么,与此问题相关的主要主题是什么?

“因为您删除的是家长,而不是孩子。请您解释一下表,这里的主键和外键是什么?您是向后的,您必须先删除所有子节点,然后在没有任何子节点时删除父节点。@Claies我认为OP只是在示例代码中混淆了这两个名称。事实上,孩子是父母,父母是孩子。@Lasse V.Karlsen(父母:PK:RestaurantMenuCategoryId FK:restaurantMenuNameId),(孩子:PK:restaurantMenuNameId)