2011-06-21 12 views
0

私は、ASP.NET MVCのサイト上でコード・ファーストアプローチでエンティティフレームワーク4.1(コードファースト)監査列

をEntity Frameworkの4.1を使用しています私はの追跡しプロフィールを名前付きエンティティを持っていると言いますユーザーが好きな本を更新したときにそのユーザーを追跡したいを更新し

例として、以下のクラスを使用して、私は現在の日付FavoriteBookプロパティが変更のたびに値FavoriteBookLastUpdatedプロパティを設定します。

public class Profile 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string FavoriteBook { get; set; } 
    public DateTime? FavoriteBookLastUpdated { get; set; } 
} 

適切であれば、今、私はちょうどDBContextのSaveChangesを()メソッドを呼び出す前に、コントローラの編集アクションで、そのフィールドを更新します。

どういうわけか、そのロジックを私のモデルに入れる方法はありますか?私は、データベース側でトリガを使用しないことをお勧めします。

+0

トリガーを使用すると、何が達成されますか? –

+0

@PerHornshøj-Schierbeck、SQL UPDATEトリガーを使用して、FavoriteBook列が変更されることを確認し、FavoriteBookLastUpdated列に現在の時刻をスタンプすることができます。それはまさに私がしたいことですが、代わりにコードで行います。 –

答えて

2

編集:私はあなたのコメントや新しい例:)

を読んで、あなたの好きな本のプロパティもLastModifiedのを設定し、実際のプロパティも持っていませんでしたか?私はEF4がそれを受け入れるかどうかはわかりませんが、FavoriteBookとEF4のための特別なものを変更するための公共の財産を作ることができます。あなたは私はあなたがそのためにEFを使用しようとすることができ、正しい一つだと思い@PerHornshøj-Schierbeckの答えが気に入らない場合は、特別なプロパティ「InternalsVisibleTo」

http://msdn.microsoft.com/en-us/library/0tke9fxk(v=vs.80).aspx

+0

+1あります。現在変更している別のプロパティを変更したい場合は、カスタムプロパティセッターがすべての処理を行う場合のように見えます。それはEFとは関係がありません。 –

+0

@Ladislav、パーフェクト。私はちょうど始めからそれを試みたはずです。私はこれを熟考していた。 FavoriteBookのカスタムパブリックプロパティセッター(およびゲッター)を作成し、lastupdatedプロパティも更新します。シンプル。 –

3

を作るために必要がある場合があります。

public override int SaveChanges() 
{ 
    foreach (var entry in ChangeTracker.Entries<Profile>()) 
    { 
     if (entry.OriginalValues == null || // I'm not sure what value this have if entity is not loaded 
      entry.Entity.FavoritBook != entry.OriginalValues["FavoriteBook"].ToString()) 
     { 
      entry.Entity.FavoriteBookLastUpdated = DateTime.Now; 
     } 
    } 

    return base.SaveChanges(); 
} 
関連する問題