如何使用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
相关产品推荐
相关产品推荐

