实体框架不会删除子项,而是将引用设置为null

时间:2012-10-12 12:50:45

标签: entity-framework cascading-deletes

我有以下情况:

首先是唯一相关的表/类(所有从DB(MySQL)自动生成):

Table

edmx文件的相关部分:

     <Association Name="navigationitem_ibfk_1">
      <End Role="navigationitem" Type="Model.Store.navigationitem" Multiplicity="0..1">
        <OnDelete Action="Cascade" />
      </End>
      <End Role="navigationitem1" Type="Model.Store.navigationitem" Multiplicity="*" />
      <ReferentialConstraint>
        <Principal Role="navigationitem">
          <PropertyRef Name="id" />
        </Principal>
        <Dependent Role="navigationitem1">
          <PropertyRef Name="navigationitemid" />
        </Dependent>
      </ReferentialConstraint>
    </Association>

我认为不需要更多的单词:它是一个导航表,每个导航项目都可以有孩子(但这不是必须的)。

现在,当我尝试删除包含子项的顶级项目时:

context.Remove(topLevelNode);
context.SaveChanges();

它会删除数据库中的顶级节点,但在子节点上它只是将navigationitemid设置为null(是的 - 当我删除时,我在数据库中的删除级联上定义了它直接在那里工作)。

所以我认为它正在发生的是,当我删除父节点时,框架将所有子节点的所有navigationitemid设置为NULL,然后当导航应保存到数据库时不会级联删除,因为子项的navigationitemidNULL

我该怎么办?谢谢。

1 个答案:

答案 0 :(得分:1)

人们想要做的显而易见的事情是在上下文中定义关联上的级联删除。但尝试它我发现sql server不支持它或EF需要帮助:

  • 在外键约束上定义级联删除(使用代码优先)会抛出sql server异常:
      

    在表'yyy'上引入FOREIGN KEY约束'xxx'可能会导致循环或多个级联路径。 (See here.

  • EF模型中的级联删除:现在删除父级时,子记录不会被删除。更糟糕的是:FK字段未被取消,外键约束违规将引发异常。补救措施是load the child collection before deleting the parent

特别是在删除navigationitem s的树时,这不是一个非常有吸引力的选项,但我担心这是你现在所拥有的全部内容。