5

私は EF4 を使用しており、Entity デザイン サーフェイスを使用してクラスを作成し、それらからデータベースを生成しています。一部のクラスに属性を追加して、最後に更新されたタイムスタンプを表示したいと考えています。

それらに Version 属性を追加しましたが、それらに関連付ける .Net データ型がわからないため、生成時にデータベースで Timestamp または RowVersion になります。

何か案は?

4

2 に答える 2

4

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; }              
}
于 2011-08-05T00:19:46.373 に答える
3

私の知る限り、rowversionは相対的なバイナリ値であり、実際の時間値ではありません。挿入と更新が発生するたびに増分します。これにより、値を比較して、どのレコードが新しいかを判断できます。これは相対的なものであるため、単一のrowversion値が与えられると何もわかりませんが、2つのrowversion値が与えられると、どちらが古いか、どちらが新しいかはわかりますが、どれだけかはわかりません。

それらに関連付ける.Netデータ型がわからないため、生成時にデータベースでTimestampまたはRowVersionのいずれかになります。

よくわかりませんが、モデルからデータベースに移動するときに行バージョンを提供するデータ型がない可能性があります。データベースのフィールドタイプを自分で変更するか、フィールドをDBに追加して、レコードをモデルに追加する必要があります。DDLを生成し、それを使用してDBを作成する前に変更することもできます。

そのクラスから派生することによってEFプロセスの機能を拡張できる別の方法もあります。その後、自分で選択できますが、その方法についてはあまり詳しくありません。

于 2011-04-19T16:59:25.827 に答える