Linq To SQL删除+插入最佳实践

时间:2016-01-27 10:24:18

标签: c# sql-server linq

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

<?php if($_product->isSaleable()): ?>
<button type="button" class="button" onclick="setLocation('<?php echo $this->getAddToCartUrl($_product) ?>')"><span><span><?php echo $this->__('Add to Cart') ?></span></span></button>
<?php else: ?>

如该帖所述: Linq to SQL: execution order when calling SubmitChanges()

我读到删除操作是应用的最后一个操作,但此刻我看到我的逻辑工作(我确信删除+插入每天都会发生十几次)。 我需要的是理解如果帖子错误或我的逻辑是什么并且出于某种原因(更新linq中的检查标志到sql datamodel?)只是幸运并避免麻烦。

之后我想知道在记录基数变化时制作“更新”的更好模式是什么。 我的意思是在我的表中有一个主键,用于标识实体(实体有许多记录)和一个用于标识同一实体(子实体)中每条记录的子键。 我需要重新生成(因为某些子实体可能被插入,编辑或删除)所以我使用delete + insert(在我写入DB的信息形式中只包含存在的实体和子enetity,而不是已删除的实体和子enetity)。

EG:

 context.DeleteAllOnSubmit ( deleteQuery ) ;

 foreach ( var entry in entries ) 
      contex.InsertOnSubmit ( entry ) ;

 context.SubmitChanges();

我没有控制权,也没有表格(以及它们内部的数据格式),也没有消息(我用来写或删除上面显示的表格)。

1 个答案:

答案 0 :(得分:1)

  

我读到删除操作是应用的最后一个操作,但此刻我看到我的逻辑工作(我确信删除+插入每天都会发生十几次)。什么我需要理解,如果帖子错误或我的逻辑是并且由于某种原因(更新linq中的检查标志到sql datamodel?)只是幸运并避免麻烦。

发布正确,最后删除了实际删除。

您的代码按设计运行,这不是偶然的。

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

这绝不会失败或不会删除错误的记录,但是它有性能问题,你可以在这个上引用非常好的msdn article

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

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

事件顺序如下:引用msdn

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

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

  3. 完成更新删除后

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

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

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

    对数据库的所有更改都将回滚,就像没有发生任何提交一样。 DataContext仍然包含所有更改的完整记录