2

我有以下情况:

首先是唯一相关的表/类(全部从数据库(MySQL)自动生成):

桌子

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();

它删除了数据库中的顶级节点,但在子节点上它只是设置navigationitemidnull(是的 - 我已经在数据库中定义了删除级联,当我直接在那里删除它时它可以工作)。

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

我能做些什么?谢谢你。

4

1 回答 1

1

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

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

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

  • EF 模型中的级联删除:现在删除父项时不会删除子记录。更糟糕的是:FK 字段没有被取消,外键约束违反会抛出异常。补救方法是在删除父集合之前加载子集合

尤其是在删除navigationitems 的树时,这不是一个非常有吸引力的选择,但恐怕这就是你目前所拥有的一切。

于 2012-10-14T15:18:44.233 回答