Linq逻辑删除与关联

时间:2010-01-29 12:24:43

标签: c# sql-server linq-to-sql

我正在尝试在所有实体中实现逻辑删除senario。所有都有一个IsDeleted布尔属性。我也想级联关联删除也。我首先将实体的部分方法添加到datacontext。

partial void DeleteQuestion(Question instance)
{
    instance.IsDeleted = true;
    ExecuteDynamicUpdate(instance);
    foreach (var answer in instance.Answers)
    {
       DeleteAnswer(answer);
    }
}

这会在ExecuteDynamicUpdate中引发错误Incorrect syntax near the keyword 'WHERE'。看看sql profiler我可以看到set子句是空白的,它没有记录IsDeleted = true;作为更改。我检查了IsDeletedChanging事件并且它确实被触发了但是我猜这个时候已经构建了变更集。

我也尝试过提交更改而不是调用ExecuteDynamicUpdate,但这会引发异常The operation cannot be performed during a call to SubmitChanges.

我见过相同的讨论here,唯一的决议是使用存储过程,我宁愿不这样做。

所以我想让我们问SO社区并获得Google搜索结果的正确答案。这个话题似乎很少。

非常感谢。

2 个答案:

答案 0 :(得分:1)

你真的需要在整个收容系统中保留已删除的状态吗?

假设你有一个问题“Q”并回答“A”和“B”。 在某些时候,你可以安全删除“A”。 (状态1)“Q有B”。

现在你安全删除“Q”,期望当你取消删除“Q”时你会得到(状态1)。 但是safedelete已将“B”设置为已删除状态,并且取消删除已将所有“Q”的子项设置为未删除状态,然后您将获得“Q具有A,B”。 safedelete和undelete操作都破坏了子集合元素的状态。

我将这个概念称为“破坏编辑”,这意味着操作是不可逆转的,并使逻辑删除几乎无用。

我建议使用“非描述性编辑”,这意味着从包含层次结构中推断出IsDeleted状态。如果父IsDeleted,这意味着孩子也被视为已删除。

答案 1 :(得分:0)

您似乎直接在代码中调用DeleteQuestion。你不应该这样做。作为Delete操作的结果,将调用此部分方法。因此,在partial方法中传递的实例已经成为Delete的目标,这就是Linq to SQL调用此方法的原因。看起来您自己调用此方法,然后尝试删除作为参数传递的实例。这不是你想要做的。