2010-01-29 76 views
0

我想实现一个逻辑删除仙境所有我的实体。所有都有一个IsDeleted布尔属性。我也想级联协会删除。我开始通过向datacontext添加实体的部分方法。Linq逻辑删除与协会

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分析器,我可以看到set子句是空白的,它不记录IsDeleted = true;作为一个变化。我检查了IsDeletedChanging事件,它确实被解雇了,但我猜这次更改集已经建立了。

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

我看到相同的讨论here,唯一的分辨率为使用存储过程,我宁愿不做。

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

非常感谢。

+0

有点偏离主题,但迭代所有答案并逐个删除它们会产生非常差的性能。您应该考虑批量删除它们。 – 2010-01-29 13:37:35

+0

正确。当我找到更新的方法时,我会重构。 我初期尝试了db.Answers.DeleteAllOnSubmit(instance.Answers),但是这会引发“在调用SubmitChanges异常期间无法执行的操作” – madcapnmckay 2010-01-29 13:50:54

回答

1

你是否真的需要在整个遏制过程中坚持删除状态?

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

现在你可以安全删除“Q”,期待当你取消删除“Q”时你会得到(状态1)。 但safedelete已将“B”设置为已删除状态,并且取消删除已将“Q”的所有子项设置为未删除状态,则您将获得“Q has A,B”。 安全删除和未删除操作都已经破坏了儿童收集元素的状态。

我把这个概念称为“解构编辑”,这意味着操作是不可逆的,并且使得逻辑删除几乎没用。

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

0

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

+0

我不是自己调用此方法,而是拦截删除调用以更改其行为。我想将物理删除改为逻辑删除。任何想法我应该做什么? – madcapnmckay 2010-01-29 12:59:57

+0

@madcapnmckay - 物理删除和逻辑删除有什么区别? – 2010-01-29 13:18:58

+0

物理 - 行被删除。该行保持逻辑但被标记为已删除。 – madcapnmckay 2010-01-29 13:49:05