我正在尝试在所有实体中实现逻辑删除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搜索结果的正确答案。这个话题似乎很少。
非常感谢。
答案 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调用此方法的原因。看起来您自己调用此方法,然后尝试删除作为参数传递的实例。这不是你想要做的。