6

下面的代码无法正确运行并抛出InvalidOperationExcepiton.

public void Foo()
{
 DataContext context = new DataContext();
 LinqEntity item = new LinqEntity(){ Id = 1, Name = "John", Surname = "Doe"} ;
 context.LinqEntities.Attach(item, true);
}
4

4 回答 4

4

默认情况下,实体在进行编辑时将使用所有字段来检查并发性。这就是引发 InvalidOperationException 的原因。

这可以将所有字段的更新检查属性设置为从不。必须在所有字段上执行此操作才能附加修改后的实体。如果这样做了,对 context.SubmitChanges() 的额外调用将​​保存数据。

或者,如果您知道原始值,则可以附加然后进行更新,但所有正在检查的值必须与原始值匹配。

LinqEntity item = new LinqEntity(){ Id = 1, Name = "OldName", Surname = "OldSurname"}; 
context.LinqEntities.Attach(item);
item.Name = "John";
item.Surname = "Doe";
context.SubmitChanges();
于 2008-09-02T18:26:10.403 回答
1

我不确定与数据库断开连接是什么意思。

您似乎正试图在 LinqEntities 表中插入一个新行——对吗?

如果是这种情况,你会想要做

context.LinqEntities.InsertOnSubmit(item);
context.Submit();
于 2008-09-02T17:21:25.177 回答
1

好的,如果您尝试更新 ID = 1 的行,您将这样做:

DataContext context = new DataContext();
LinqEntity item = (from le in context.LinqEntities
                  where le.ID == 1
                  select le).Single();
item.Name = "John";
item.Surname = "Doe";

context.Submit();

您还可以用更简洁的 lambda 替换 Linq 表达式:

LinqEntity item = context.LinqEntities.Single(le => le.ID == 1);

DataContext 所做的最重要的事情是跟踪您所做的任何更改,因此当您调用 Submit 方法时,它会为您更改的内容自动生成 Insert 语句。

于 2008-09-02T17:32:18.113 回答
0

使用 ORM 时,您通常会在更新对象之前选择它。

DataContext.ExecuteCommand(...)如果您不想进行选择,可以使用绕过 ORM。

于 2008-09-03T00:07:56.463 回答