下面的代码无法正确运行并抛出InvalidOperationExcepiton
.
public void Foo()
{
DataContext context = new DataContext();
LinqEntity item = new LinqEntity(){ Id = 1, Name = "John", Surname = "Doe"} ;
context.LinqEntities.Attach(item, true);
}
默认情况下,实体在进行编辑时将使用所有字段来检查并发性。这就是引发 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();
我不确定与数据库断开连接是什么意思。
您似乎正试图在 LinqEntities 表中插入一个新行——对吗?
如果是这种情况,你会想要做
context.LinqEntities.InsertOnSubmit(item);
context.Submit();
好的,如果您尝试更新 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 语句。
使用 ORM 时,您通常会在更新对象之前选择它。
DataContext.ExecuteCommand(...)
如果您不想进行选择,可以使用绕过 ORM。