私は EF4 を使用しており、Entity デザイン サーフェイスを使用してクラスを作成し、それらからデータベースを生成しています。一部のクラスに属性を追加して、最後に更新されたタイムスタンプを表示したいと考えています。
それらに Version 属性を追加しましたが、それらに関連付ける .Net データ型がわからないため、生成時にデータベースで Timestamp または RowVersion になります。
何か案は?
私は EF4 を使用しており、Entity デザイン サーフェイスを使用してクラスを作成し、それらからデータベースを生成しています。一部のクラスに属性を追加して、最後に更新されたタイムスタンプを表示したいと考えています。
それらに Version 属性を追加しましたが、それらに関連付ける .Net データ型がわからないため、生成時にデータベースで Timestamp または RowVersion になります。
何か案は?
byte[]
行バージョン/タイムスタンプにタイプを使用します
使用例: http://www.ienablemuch.com/2011/07/using-checkbox-list-on-aspnet-mvc-with_16.html
デザイナーにいる場合は、byte[]
またはSystem.Byte[]
を入力するだけで、EFデザイナーのフィールドタイプのドロップダウン選択で入力できると思います。
この DDL を考えると
create table Movie
(
MovieId int identity(1,1) not null primary key,
MovieName varchar(100) not null unique,
MovieDescription varchar(100) not null unique,
YearReleased int not null,
Version rowversion -- rowversion and timestamp are alias of each other
);
これはクラス マッピングです。
public class Movie
{
[Key]
public virtual int MovieId { get; set; }
[ Required, Display(Name="Title")
] public virtual string MovieName { get; set; }
[ Required, Display(Name="Description")
] public virtual string MovieDescription { get; set; }
[ Required, Display(Name="Year Released"), Range(1900,9999)
] public virtual int? YearReleased { get; set; }
[Timestamp]
// byte[] is the rowversion/timestamp .NET type
public virtual byte[] Version { get; set; }
public virtual IList<Genre> Genres { get; set; }
}
私の知る限り、rowversionは相対的なバイナリ値であり、実際の時間値ではありません。挿入と更新が発生するたびに増分します。これにより、値を比較して、どのレコードが新しいかを判断できます。これは相対的なものであるため、単一のrowversion値が与えられると何もわかりませんが、2つのrowversion値が与えられると、どちらが古いか、どちらが新しいかはわかりますが、どれだけかはわかりません。
それらに関連付ける.Netデータ型がわからないため、生成時にデータベースでTimestampまたはRowVersionのいずれかになります。
よくわかりませんが、モデルからデータベースに移動するときに行バージョンを提供するデータ型がない可能性があります。データベースのフィールドタイプを自分で変更するか、フィールドをDBに追加して、レコードをモデルに追加する必要があります。DDLを生成し、それを使用してDBを作成する前に変更することもできます。
そのクラスから派生することによってEFプロセスの機能を拡張できる別の方法もあります。その後、自分で選択できますが、その方法についてはあまり詳しくありません。