Linq To Sql中的更新

时间:2010-10-06 21:01:43

标签: c# sql linq linq-to-sql

更新记录,而不是查询上下文并单独更新每条记录, 我们目前使用的代码在现有的行集上执行DeleteAllOnSubmit,在新的行集上使用InsertAllOnSubmit。 这适用于我们的大多数场景,因为如果插入/删除相同的行(内容),即使我们在ChangeSet中有插入和删除,它也会被删除。此外,如果主键相同,并且记录具有不同的内容,则会将其转换为单个更新。我们遇到的问题是主键的匹配是不区分大小写的,比如'abc'和'Abc',Linq认为它们是不同的键,然后尝试先运行Insert,然后执行delete next,因为主键失败违规,因为对于我们的数据库设置,两个主键被认为是相等的。有没有一种方法可以让Linq使用不区分大小写的比较,当它确定ChangeSet中插入和删除的更新时?

我知道另一种方法是查询数据库,如果记录存在,则执行更新而不是插入和删除。但我们确实有多个对象的逻辑,我们希望看看是否还有其他选项可用。

感谢您的回复。

让我试着用一个例子来解释我们的问题。

假设我们有两个表,一个银行和一个分行,其中银行可以有多个分支。

我们有一组需要在表中设置的分支。因此,逻辑是删除该银行的所有分支并将其设置为我们拥有的分支集。

我们现有的代码做了一些事情

DataContext dc = new DataContext();

var destBranches = dc.Branches.Where(b => b.BankID.Equals("123"));

dc.Users.DeleteAllOnSubmit(destBranches);
dc.Branches.InsertAllOnSubmit(branches);

如果我们使用更新路由,对于每个分支,我们必须查看它是否存在于dest中,然后修改其属性,如果没有插入它,最后如果任何dest分支不在分支集合中,则删除它。我们有很多表需要进行此更改。

2 个答案:

答案 0 :(得分:0)

如果您有SQL 2008,请考虑使用MERGE语句。它一次执行更新/插入。 SQL 2008 s'procs也接受表值参数,这将使这个变得微不足道。

答案 1 :(得分:0)

您也可以尝试Plinqo。它会为您完成所有批量更新脏工作。