您必须记住,诸如此类的操作deleteAllOnSubmit
不会转换为 SQL 并在现场执行。
ITable.DeleteAllOnSubmit 方法:
将集合中的所有实体置于挂起删除状态。
请参阅:http: //msdn.microsoft.com/en-us/library/system.data.linq.itable.deleteallonsubmit.aspx
在您执行以下操作之前,不会发生删除:
db.SubmitChanges();
更新1:
如果您的表为空,则不会出现删除语句。此外,SubmitChanges
它的规范允许在您的特定场景中尝试变得聪明,尽管如果您有触发器,您认为会被执行,您会感到失望。如果您有删除/插入触发器,您可能需要考虑在 LINQ“删除”之后使用 SubmitChanges。
DataContext.SubmitChanges 方法: 计算要插入、更新或删除的修改对象集,并执行适当的命令来实现对数据库的更改。
http://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.submitchanges.aspx
注意:此更新是在 OP 检查并验证调用时表为空之后进行的SubmitChanges()
。稍后,OP 检查并验证当从表中删除数据只是用相同的数据替换时也会发生这种情况。
更新 2:
@Brian 很高兴听到您在这方面取得了进展:-)
一般建议:
- 除非您知道自己在做什么,否则避免将 ExecuteCommand 与 L2S 混合使用;
ExecuteCommand
的可能会改变 L2S 脚下的数据库状态并让您(当之无愧!)头疼!如果您不害怕这样的头痛,您可以尝试ExecuteCommand
在 L2S 访问表之前删除行(更快,但您需要正确处理)。如果您害怕这样的头痛并且只想在 SQL 服务器上触发“删除”事件,只需SubmitChanges
在问题代码中的 L2S“删除”之后执行一个操作。
- 您可以依靠 与数据库进行细粒度的 L2S 交互
SubmitChanges
,但从长远来看,最好意识到您获得了一个以全新方式与数据库交互的工具。L2S 试图变得聪明,这还不错。使用它为您带来优势!在这种特殊情况下,它为您节省了一些不必要的删除/插入操作,实际上优化了您的代码,而您无需做任何事情。试图变得那么聪明有错吗?是的,如果您单独考虑操作,如果您认为它试图做的只是使用代码操作的净效果更新数据库,则不。