2016-06-21 7 views
1

このASP.Netコードがあり、実行中にエラーが発生しました。エラー:.Attachの後にタイムスタンプ列を更新できません

サーバー:メッセージ272、レベル16、状態1、行1:タイムスタンプ 列を更新できません。ここで

は、私がすでに持っているこのテーブルのマッピングです:。。

プロパティ( "バージョン" @)(X => x.Version).HasColumnName IsOptional()HasColumnType(「タイムスタンプ").HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Computed);

私のテーブルにはバージョンの列があります。

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); 
    } 

Iは、方法中の2つの行にコメントを追加することによって、エラーを修正することができました。しかし、誰かがなぜ私がそれらの行をコメントアウトしないとエラーが発生しているのか説明することができます。 wordFormを添付してModifiedとマークすることはできませんか?

+0

'timestamp'は' rowversion'の廃止予定の名前です。それは時間とは関係ありません –

+0

エンティティのrowversionプロパティに '[TimeStamp]'属性を追加してください –

答えて

3

テーブルには、楽観的同時実行に使用されるrowversionまたはtimestampフィールドがある可能性があります。 rowversionフィールドを設定または更新することはできません。これらは、行が変更されるたびに自動的に増分される値です。

TimeStamp属性を使用してrowversionプロパティをマークし、問題を回避するには、次のtimestampから混乱

のビットを起こすタイプの名前を非推奨で、実際には

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

docs:

タイムスタンプ構文は非推奨です。この機能は、将来のバージョンのMicrosoft SQL Serverでは削除されます。新しい開発作業でこの機能を使用しないでください。現在、この機能を使用しているアプリケーションを変更する予定です。

+0

私はすでにその列のマッピングがあることを示すために質問を更新しました。 –

関連する問題