2009-04-19 82 views
0

只要我坚持只读操作,L2SQL看起来很棒。只要我需要开始改变领域,事情会变得有点多毛。使用Linq-2-SQL插入和更新

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

首先,我试图填充任意数量的行的表。该模式大多不相关,但它确实有一个'BIGINT'主键,它是标识列。因为主键是一个标识,所以在调用Table.InsertOnSubmit()或Table.InsertAllOnSubmit()之前我没有设置它,而且我产生了一个DuplicateKeyException:“不能添加一个实体已在使用中。”

我的第二个问题,从需要LINQ等同于以下SQL语句茎:

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

如果我第一次查询所需要的行,然后换一个DataContext.SubmitChanges(前someCol的价值),都是精细。 但是,我正在寻求一种解决方案,不需要我先查询该行。换句话说,如果主键是已知数量,那么如何执行?

回答

1

回想一下Jose指出的问题,我从中得到的结果是,当人们尝试插入相同的对象两次时,他们会得到错误(这是有道理的 - 第一个插入内容会贴上ID然后第二个更新将插入刚刚创建的ID);是否有可能在提交两次(或多次)提交插入标记相同的对象?你说你插入了一个“任意数量的行” - 为什么你不把它放到只有一个。

从本质上讲,LINQ到SQL应该处理这种情况,你都在谈论它 - 标识列不应该填充值,并调用InsertOnSubmit()和的SubmitChanges得到它在

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

+0

你很可能是正确的第二部分。但是我很遗憾,我对SPROC知之甚少,并且在我能够考虑这个解决方案之前必须学会自己。 – Kivin 2009-04-19 07:39:06

0

对于你的第一个问题:你的PK自动增加了数据库吗?

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

问:我可以毫不 首先查询更新数据库表中的数据?

A.虽然LINQ to SQL中没有 基于集合的更新命令,你可以使用 以下任一技术 更新而不先查询:

使用ExecuteCommand发送SQL代码。

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

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

1

我找到了我的问题的答案。

首先,我对重复键的问题是由于设计器导致我的表得不到导入。我从服务器资源管理器中删除了连接,并从头开始并解决了这个问题。

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

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”属性的实际用途缺乏了解。

0

在回答你的第二个问题:

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