Linq To SQL 删除 + 插入最佳做法

本文关键字:最佳 插入 To SQL 删除 Linq | 更新日期: 2023-09-27 18:32:01

如标题中所述,我需要执行删除+插入,我做:

 context.DeleteAllOnSubmit ( deleteQuery ) ;
 foreach ( var entry in entries ) 
      contex.InsertOnSubmit ( entry ) ;
 context.SubmitChanges();

正如那篇帖子中所写:Linq to SQL:调用 SubmitChanges() 时的执行顺序

读到删除操作是最后一个应用的操作,但目前我看到我的逻辑工作(我确定删除+插入每天发生数十次)。我需要的是了解帖子是否错误,或者我的逻辑是错误的,并且由于某种原因(将linq中的检查标志更新到sql数据模型?)只是幸运并避免麻烦。

之后,我想知道当记录基数发生变化时进行"更新"的更好模式是什么。我的意思是在我的表中有一个标识实体的主键(一个实体有许多记录)和一个子键标识同一实体(子实体)中的每条记录。我需要重新生成(因为某些子实体可能会入、编辑或删除),所以我使用删除 + 插入(在我写入数据库的消息形式中,仅包含存在的实体和子实体和子网络,而不是已删除的实体)。

例如:

 ID     SubID    Data
 1      1_0      Father      
 2      2_0      Father
 2      2_1      Child 1
 3      3_0      Father
 3      3_1      Child 1
 3      3_2      Child 2

无法控制表(以及其中的数据格式)或消息(我用来编写或删除上面列出的表)。

Linq To SQL 删除 + 插入最佳做法

读到删除操作是最后一个应用的操作,但目前我看到我的逻辑工作(我确定删除+插入每天发生数十次)。我需要的是了解帖子是否错误,或者我的逻辑是错误的,并且由于某种原因(将linq中的检查标志更新到sql数据模型?)只是幸运并避免麻烦。

帖子是正确的,最后删除实际上被删除了。

您的代码正在按照设计工作,这不是偶然的。

它实际上加载所有要删除的记录,然后逐个删除。这终于发生了。

这永远不会失败或不会删除错误的记录,但是它有性能问题,您可以参考非常好的 msdn 文章

无论对对象进行了多少更改,都只会对内存中的副本进行更改。您尚未对数据库中的实际数据进行任何更改。您的更改不会传输到服务器,直到您在数据上下文上显式调用 SubmitChanges。

进行此调用时,DataContext 会尝试将您的更改转换为等效的 SQL 命令。您可以使用自己的自定义逻辑来覆盖这些操作,但提交顺序由称为更改处理器的 DataContext 服务编排。

事件的顺序如下:请参阅 msdn

  1. 调用 SubmitChanges 时,LINQ to SQL 将检查已知对象的集,以确定是否已将新实例附加到这些对象。如果有,这些新实例将添加到跟踪对象集中。这就是为什么我们一开始说插入

  2. 所有具有挂起更改的对象都根据它们之间的依赖关系排序到一系列对象中。其更改依赖于其他对象的对象在其依赖项之后进行排序。然后更新

更新删除完成后

在传输任何实际更改之前,LINQ to SQL 会立即启动一个事务来封装一系列单独的命令。

对对象的更改将逐个转换为 SQL 命令并发送到服务器。

此时,数据库检测到的任何错误都会导致提交过程停止,并引发异常。

对数据库所做的所有更改都将回滚,就好像从未发生过任何提交一样。DataContext 仍然具有所有更改的完整记录