5

私たちが持っているとしましょう:

public class Driver
{
    public int driverID { get; set; }
    public byte[] stamp { get; set; }
    public string name { get; set; }
    public string prename { get; set; }
}

要するに、私はこのような状況に直面しています。

 ...
 var myDriver = myCustomDBContext.Drivers.AsNoTracking()
                                         .Where(d => d.driverID == driverID)
                                         .SingleOrDefault();
 ...
 myDriver.name = "John";
 myDriver.prename = "Lennon";
 ...
 myCustomDBContext.Drivers.Attach(myDriver);
 myCustomDBContext.Entry(myDriver).State = EntityState.Modified;
 myCustomDBContext.SaveChanges();
 ...

そして結果は

 The column cannot be modified because it is an identity, rowversion or 
     a system column. [Column name = stamp]

デタッチされたエンティティの更新を強制する方法、またはこのrowversion列が Modified として設定されないようにするための回避策はありますか。

4

1 に答える 1

7

stampモデルでプロパティを行バージョンとして指定していないようで、単なるバイナリ フィールドです。Fluent API で指定できます。

modelBuilder.Entity<Driver>().Property(d => d.stamp)
    .IsRowVersion()
    .IsConcurrencyToken(false);

stamp上記のコードは、プロパティを同時実行トークンとして使用したくない場合用です。(rowversion は既定で同時実行トークンであるため、明示的に無効にする必要があります。)同時実行トークンとして使用する場合は、Fluent API で使用できます...

modelBuilder.Entity<Driver>().Property(d => d.stamp)
    .IsRowVersion();

...またはデータ注釈付き:

[Timestamp]
public byte[] stamp { get; set; }

これにより、EF がこのプロパティの UPDATE を書き込むことができなくなります。

編集

Database-First 戦略を使用する場合、[Timestamp]属性は機能しません。この属性は、Code-First 開発専用です。

Database-First を使用する場合、接続文字列には、EDMX ファイルで定義された EDM を参照するメタデータ セクションが含まれます。

connectionString="metadata=res://*/Model1.csdl
                          |res://*/Model1.ssdl
                          |res://*/Model1.msl;
                          ...
                          ..."

Entity Framework が接続文字列でこのセクションを検出した場合、モデル プロパティでデータ注釈を使用せず、Fluent API でコードを処理しません (OnModelCreatingまったく呼び出されません)。代わりに、埋め込まれてコンパイルされた EDMX ファイルからマッピング定義を読み込みます。

つまり、stampプロパティを同時実行トークンとして定義する場合は、EDMX ファイルでこれを行う必要があります。XML では、次のようになります。

SSDL セクション:

<Property Name="stamp" Type="timestamp" Nullable="false"
          StoreGeneratedPattern="Computed" />

CSDL セクション:

<Property Name="stamp" Type="Binary" Nullable="false" MaxLength="8"
          FixedLength="true"
          annotation:StoreGeneratedPattern="Computed"
          ConcurrencyMode="Fixed" />

Visual Studio のモデル デザイナーでこれを定義することもできます。stampデザイナー サーフェイスでエンティティのプロパティをマークし、[プロパティ] ウィンドウに移動して、[同時実行モード] を [固定] に設定します (また、[StoreGeneratedPattern] を [計算済み] に設定します)。 」)。

接続文字列からメタデータ セクションを削除することもできます。しかし、これは事実上、データベース ファーストからコード ファーストの開発に切り替えることを意味します。その後、すべての属性と Fluent API が考慮されますが、EDMX の定義は考慮されなくなります。

于 2012-04-27T16:33:32.423 に答える