You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用System.Data.Linq.DataContext通过Linq-To-SQL更新对象

使用Linq-To-SQL实现WebAPI的PUT更新优化方案

业务场景

  • 客户端向WebAPI请求指定ID的对象;
  • WebAPI将对象返回给客户端;
  • 客户端修改该对象的若干属性;
  • 客户端通过PUT方法将完整对象(而非仅修改的属性)传回WebAPI;
  • WebAPI需使用Linq-To-SQL更新数据库。

初始尝试与问题

尝试的更新代码无法正常运行(WebAPI端点为无状态):

[HttpPut]
[ActionName("Update")]
public IHttpActionResult Update(MyModel myModel)
{
    this.context.MyModel.Attach(myModel);
    this.context.SubmitChanges();
    
    return Ok();
}

曾见过EF的类似解决方案,但本人使用的是System.Data.Linq.DataContext,该类没有Entry属性,无法直接套用:

[HttpPut]
[ActionName("Update")]
public IHttpActionResult Update(MyModel myModel)
{
    this.context.MyModel.Add(myModel);
    this.context.Entry(myModel).State = System.Data.Entity.EntityState.Modified;
    this.context.SaveChanges();
    return Ok();
}

后续尝试与报错

按照建议尝试以下代码:

this.context.MyModel.Attach(myModel, true);
context.SubmitChanges();

返回错误:

An entity can only be attached as modified without original state if it declares a version member or does not have an update check policy.

随后尝试先获取数据库当前对象再附加:

var currentDbModel = this.context.MyModel.GetByKey(myModel.ID);
this.context.MyModel.Attach(myModel, currentDbModel);
context.SubmitChanges();

出现错误:

"Cannot add an entity with a key that is already in use."

当前可行但待优化的方案

目前能正常运行的代码如下,但需要先查询数据库获取当前记录,还需重新创建DataContext,希望能优化:

var currentDbModel = this.context.MyModel.GetByKey(myModel.ID);
this.context = new DataContext(this.cnn);
this.context.MyModel.Attach(myModel, currentDbModel);
context.SubmitChanges();

内容的提问来源于stack exchange,提问作者Code Pope

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 12:01:05