繁体   English   中英

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

[英]Inserting and Updating using Linq-2-SQL

只要我坚持只读操作,L2SQL似乎很棒。 一旦我需要开始更改字段,事情就会变得有些麻烦。

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

首先,我试图用任意数量的行填充一个表。 该架构基本上无关紧要,但是它确实有一个“ BIGINT”主键,即身份列。

由于主键是一个标识,因此在调用Table.InsertOnSubmit()或Table.InsertAllOnSubmit()之前不会对其进行设置,并且会产生一个DuplicateKeyException:“无法使用已使用的键添加实体。 “

我的第二个担忧是由于需要与以下SQL语句等效的LINQ:

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

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

看看Jose指出的问题,我从中得到的是,当人们尝试两次插入同一对象时,人们会收到您所得到的错误(这很有意义-第一个插入将附加在ID上,第二个更新将附加到ID上)然后将插入刚刚创建的ID); 您是否可能标记同一对象以便两次提交(或多次)提交插入? 您说要插入“任意数量的行”-为什么不尝试将其仅减少到一行。

本质上,Linq to SQL应该处理您所讨论的情况-Identity列不应填充值,并且您可以调用InsertOnSubmit()和SubmitChanges来获取它。

至于您的第二个问题,我认为Linq to SQL没有任何明确的方式来完成您想要的事情。 可能最简单/最佳的解决方案是拥有一个存储程序来更新所需的数据,然后使用Linq将其调用到SQL(传递要更新的记录ID)。

我已找到问题的答案。

首先,重复键的问题是由于设计器无法正确导入表而导致的。 我从服务器资源管理器中删除了连接,并从头开始,然后解决了该问题。

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

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();
}

需要注意的是,我必须将所有表列的“ Update Check”属性设置为“ Never”,否则会引发异常。 这让我感到不舒服,并让我相信这不是最佳解决方案,但这可能部分是由于我对“更新检查”属性的实际用途缺乏了解。

针对您的第二个问题:

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

对于第一个问题:DB是否自动增加了您的PK?

对于您的第二个问题,如果理解正确,以下内容应该有所帮助(摘自L2S上的MSDN FAQ)。 您应该测试以下内容,因为我在MSDN方面经验不足;-):

问:是否可以不先查询数据库就更新表数据?

答:尽管LINQ to SQL没有基于集合的更新命令,但是您可以使用以下两种技术之一来进行更新,而无需先查询:

使用ExecuteCommand发送SQL代码。

创建对象的新实例,并初始化影响更新的所有当前值(字段)。 然后,使用“附加”将对象附加到DataContext,并修改要更改的字段。

请注意:要进行更新而不查询,您必须确保DataContext尚未加载相同的对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM