C# 具有关联的Linq逻辑删除
我正在尝试在我的所有实体中实现逻辑删除senario。它们都具有IsDeleted布尔属性。我还想级联的协会删除也。我首先向datacontext添加实体的分部方法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) {
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异常期间无法执行操作”