.Attach后无法更新时间戳列

时间:2016-06-21 11:42:18

标签: asp.net entity-framework asp.net-web-api

我有这个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并标记为已修改?

1 个答案:

答案 0 :(得分:3)

您的表可能有一个rowversiontimestamp字段,用于乐观并发。 rowversion字段根本无法设置或更新。它们是每次修改行时自动递增的值。

要避免此问题,请使用TimeStamp属性标记rowversion媒体资源:

[TimeStamp]
public byte[] RowVersion { get; set; }

事实上,timestamp是该类型的已弃用的名称,会导致一些混淆

来自文档:

  

不推荐使用时间戳语法。将在Microsoft SQL Server的未来版本中删除此功能。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。