2011-05-28 37 views
0

在向表中插入新值之前,我需要在该表的所有行中更改一个字段。 要做到这一点的最佳方法是什么?在C#代码中,矿石使用触发器?如果C#可以向我展示代码?Linq to SQL,在一次插入前更新大量数据

UPD * 问题 * 你好的新版本。在向表中插入新值之前,我需要在该表的所有行中使用特定ID更改一个字段(这是FK到另一个表)。 要做到这一点的最佳方法是什么?在C#代码中,矿石使用触发器?如果C#可以向我展示代码?

+0

在任何情况下,触发器的工作速度都比linq to sql快,因为LINQ不允许通过单个请求更改大量数据。 – Egor4eg 2011-05-28 21:42:14

回答

2

你可能应该考虑改变你的设计,这听起来不会很好,如果它总是需要的话,我可能会用触发器来做,但如果不是这样,id使用ExecuteCommand

var ctx = new MyDataContext(); 
ctx.ExecuteCommand("UPDATE myTable SET foo = 'bar'"); 
+0

假设我有我的项目版本。如果我更新我的项目,我将保存新版本。我需要知道最后的项目是什么。出于这个原因,只有一行应该有价值。 – Sergii 2011-05-28 21:46:31

+1

+1特别注意缩放问题;那可怜的无辜交易日志!毫无疑问的差异备份。 – 2011-05-28 21:47:38

+1

@Sergii啊,一个时态数据库......有几种方法可以解决这个问题,但即使这样也不完全是“所有行”更新 - 它只是这个项目的“最后一个活动行”更新。 。每个修订插入一个更新的行。它也可以以追加方式完成,但找到“主动”则比较昂贵。另一种方法是单独审计表,所以事务处理是有效的,只有 – 2011-05-28 21:50:41

0

看着你对保罗答案的评论,我觉得我应该在这里留言。我们有几张表格,我们需要保留表格中每个条目的历史记录。我们通过为每个表创建一个单独的表来实现它。例如,我们可能有一个Comment表,然后CommentArchive表具有外键引用到Comment表中的CommentId

Comment表中的触发器可确保在Comment表中的每个时间的某些字段被更新,“旧”版本(这是通过在该触发器的deleted表访问)被推到CommentArchive表。显然,这意味着每个Comment可能存在多个CommentArchive条目,但如果您只查找“活动”评论,则只需查看Comment表中的内容。如果您需要关于评论历史的信息,则可以轻松使用LINQ to SQL从您感兴趣的评论跳转到引用该评论的评论存档。

因为我们在上面的例子中使用的触发器只为每个更新插入一个单独的值到存档表中,所以它们运行得非常快,我们获得了很好的性能。最近我们遇到了一些问题,我试图让触发器更加复杂,我们开始通过少量15个并发事务获取死锁。所以,教训是你应该使这些触发器变得简单,并尽可能地使它们在尽可能少的表中触摸尽可能少的行。