如何在Linq中更新与数据库断开连接的实体?

时间:2020-03-05 18:46:36  来源:igfitidea点击:

以下代码无法正常运行,并抛出InvalidOperationExcepiton。

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

解决方案

回答

我不确定从数据库断开连接的意思。

看来我们正在尝试在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语句。

回答

默认情况下,实体在进行编辑时将使用所有字段来检查并发性。那就是抛出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();

回答

使用ORM时,通常在更新对象之前先选择一个对象。

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