我有这个ASP.Net代码,运行时遇到错误。错误是:
服务器:消息272,级别16,状态1,行1无法更新时间戳 列。
这是我已经拥有的这张桌子的映射:
属性(x =&gt; x.Version).HasColumnName(@&#34;版本&#34;)IsOptional()HasColumnType(&#34;时间戳&#34;)HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Computed); < / p>
请注意,我的表格中有一个版本列。
public async Task<IHttpActionResult> Put([FromBody]WordForm wordForm)
{
// SampleSentences -> s
var oldsObj = db.SampleSentences
.Where(w => w.WordFormId == wordForm.WordFormId)
.AsNoTracking()
.ToList();
var newsObj = wordForm.SampleSentences.ToList();
// There is other code here to modify SampleSentences
//
//
// db.WordForms.Attach(wordForm);
// db.Entry(wordForm).State = EntityState.Modified;
wordForm.StatusId = (int)EStatus.Saved;
await db.SaveChangesAsync(User, DateTime.UtcNow);
return Ok(wordForm);
}
我能够通过向方法中的两行添加注释来修复错误。但有人可以解释为什么我会收到错误,如果我不评论这些行。我是否应该无法附加wordForm并标记为已修改?
答案 0 :(得分:3)
您的表可能有一个rowversion
或timestamp
字段,用于乐观并发。 rowversion字段根本无法设置或更新。它们是每次修改行时自动递增的值。
要避免此问题,请使用TimeStamp属性标记rowversion
媒体资源:
[TimeStamp]
public byte[] RowVersion { get; set; }
事实上,timestamp
是该类型的已弃用的名称,会导致一些混淆
来自文档:
不推荐使用时间戳语法。将在Microsoft SQL Server的未来版本中删除此功能。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。