C# 具有关联的Linq逻辑删除

C# 具有关联的Linq逻辑删除,c#,sql-server,linq-to-sql,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) {

我正在尝试在我的所有实体中实现逻辑删除senario。它们都具有IsDeleted布尔属性。我还想级联的协会删除也。我首先向datacontext添加实体的分部方法

partial void DeleteQuestion(Question instance)
{
    instance.IsDeleted = true;
    ExecuteDynamicUpdate(instance);
    foreach (var answer in instance.Answers)
    {
       DeleteAnswer(answer);
    }
}
这会在ExecuteDynamicUpdate的关键字“WHERE”附近抛出错误的语法。查看sql profiler,我可以看到set子句为空,它没有记录
IsDeleted=true作为更改。我检查了IsDeletedChanging事件,它确实被触发了,但我想此时更改集已经构建好了

我还尝试提交更改而不是调用ExecuteDynamicUpdate,但这会引发异常
在调用SubmitChanges期间无法执行该操作。

我看到了一个相同的讨论,唯一的解决方案是使用存储过程,我不希望这样做

所以我想让我们问问So社区,并得到一个关于谷歌搜索结果顶部的正确答案。关于这个话题似乎没有什么内容


非常感谢。

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

您真的需要在整个安全壳继承权中保留已删除状态吗

假设你有一个问题“Q”,回答“a”和“B”。 在某一点上,您可以删除“A”。 (国家1)“Q有B”

现在您安全地删除了“Q”,希望当您取消删除“Q”时,您将得到(状态1)。 但是safedelete已经将“B”设置为已删除状态,而undelete已经将“Q”的所有子项设置为未删除状态,那么您将得到“Q有A,B”。 safedelete和undelete操作都破坏了子集合元素的状态

我把这个概念称为“破坏编辑”,这意味着操作是不可逆的,并且使得逻辑删除变得毫无用处


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

我不是自己调用此方法,而是拦截删除调用以更改其行为。我想将物理删除更改为逻辑删除。知道我应该做什么吗?@madcapnmckay-物理删除和逻辑删除有什么区别?物理删除-行被删除。逻辑行仍然保留,但标记为已删除。有点离题,但遍历所有答案并逐个删除它们将产生非常差的性能。您可能应该考虑批量删除它们。正确。当我找到更新的方法时,我将进行重构。我最初尝试了db.Answers.deleteAllonsSubmit(instance.Answers),但这会引发“在调用SubmitChanges异常期间无法执行操作”