使用Linq-2-SQL插入和更新

时间:2009-04-19 04:29:50

标签: c# asp.net linq-to-sql

只要我坚持只读操作,L2SQL似乎很棒。一旦我需要开始改变田地,事情就会变得有点毛茸茸。

特别是,我遇到了两个不同的问题。

首先,我正在尝试使用任意行数填充表。模式大多不相关,但它确实有一个'BIGINT'主键,它是标识列。

由于主键是一个标识,我在调用Table.InsertOnSubmit()或Table.InsertAllOnSubmit()之前没有设置它,我正在产生一个DuplicateKeyException:“无法添加一个已经存在密钥的实体在使用中。“

我的第二个问题源于需要一个等同于以下SQL语句的LINQ:

UPDATE dbo.someTable SET someCol = 'someValue' WHERE pkValue = 20

如果我先查询所需的行,然后在DataContext.SubmitChanges()之前更改someCol的值,一切都很好。 但是,我正在寻找一种不需要我先查询行的解决方案。换句话说,如果主键是已知数量,那么如何执行?

4 个答案:

答案 0 :(得分:1)

看看Jose指出的问题,我得到的是人们在尝试两次插入相同的对象时得到的错误(这是有意义的 - 第一个插入将在ID和然后第二次更新将插入刚刚创建的ID);是否有可能在提交两次(或更多次)时标记相同的对象以进行插入?你说你正在插入“任意数量的行” - 你为什么不试着把它放到只有一行。

基本上,Linq to SQL应该在你谈论它时处理这种情况 - 一个Identity列不应该填充值,你可以调用InsertOnSubmit()和SubmitChanges来获取它。

至于你的第二个问题,我不认为Linq to SQL有任何明确的方式来做你想要的。可能最简单/最好的解决方案是使用一个更新所需数据的sproc,然后使用Linq to SQL调用它(传递你想要更新的记录ID)。

答案 1 :(得分:1)

我找到了问题的答案。

首先,我遇到重复键的问题是我的表被Designer导入效果不佳的结果。我从服务器资源管理器中删除了连接,并从头开始,解决了这个问题。

其次,我已确定以下代码示例解决了我的第二个问题:

using( var dc = new MyDataContext() )
{
   TableValue row = new TableValue();
   row.pkValue = 20;
   dc.TableValues.Attach(row); // DataContext thinks 'row' is the original.

   row.someCol = "Changed Value";  // DataContext formats an UPDATE statement
   dc.SubmitChanges();
}

需要注意的是,我必须将所有表列的“更新检查”属性设置为“从不”,否则会抛出异常。这让我觉得有点不舒服,并让我相信这不是最好的解决方案,但这可能部分是因为我对“更新检查”属性的实际目的缺乏了解。

答案 2 :(得分:0)

第一个问:你的PK是否由DB自动递增?

对于您的第二个Q,如果理解正确,以下应该有所帮助(取自关于L2S的MSDN常见问题解答)。您应该测试以下内容,因为我有使用MSDN的错误经验;-):

  

Q值。我可以不用更新表数据吗?   首先查询数据库?

     

一个。虽然LINQ to SQL没有   基于set的更新命令,你可以使用   以下任何一种技术   没有先查询更新:

     

使用ExecuteCommand发送SQL代码。

     

创建对象的新实例   并初始化所有当前值   (字段)影响更新。然后   将对象附加到DataContext   通过使用附加和修改字段   你想改变。

请注意:对于不查询的更新,您必须确保DataContext没有加载相同的对象。

答案 3 :(得分:0)

回应你的第二个问题:

DataContext.someTable.Where(a => a.pkValue == 20).SingleOrDefault().someCol = 'someValue';
DataContext.SubmitChanges();