如何在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。