1

asp.net MVC 3アプリケーションで作業しています。私はcodeFirstアプローチを使用しています。私は履歴テーブルまたはユーザーテーブルを作成しようとしています。ここでは、ユーザーによって変更された列を追跡する必要があります。どうすればEF Code Firstを使ってこれを行うことができますか?Entity Framework 4.1を使用して履歴テーブルを作成する

DataContext.savechangesの後に行う必要がありますか?

お勧めします。

ありがとうございました。

+0

監査に関する興味深い投稿があります[こちら](http://blogs.msdn.com/b/simonince/archive/2009/04/20/auditing-data-changes-in-the-entity-framework- part-2.aspx)、どう思いますか? – ibiza

答えて

1

DbContextは、方法は、Entry<T>呼び出した:

var entity = context.Items.Find(id); 
entity.Name = "foobar"; 

var entry = context.Entry<Item>(entity); 

エントリは、タイプDbEntityEntry<T>のものと物性OriginalValuesCurrentValuesを有しているであろう。

これらのプロパティを一般的に検査して何が変更されたかを確認し、自動的に履歴テーブルに新しいレコードを挿入するようなものを書いている可能性があります。

いずれか、またはデータベーストリガーを使用します。

0

私は、これは実際にそれを行うには、「appropiate」の方法であるかどうかわからないんだけど、これは通常、SQLで行う方法です:

  1. int型か何かの余分な性質versionを作成します。
  2. あなたはおそらく、エンティティを保存するとbool型
  3. の別のプロパティIsLatestVersionを追加し、ループに毎回たくないのでエンティティが既に存在する場合は、確認してください。その場合は、IsLatestVersion = falseにエンティティを設定します。
  4. versionをインクリメントし、変更を新しいエンティティとして保存します。
+0

私は元のテーブルと他の1つが履歴テーブルである2つのテーブルを作成したいと思います。ユーザーがcolumn1とcolumn5を更新した場合、この日付でカラム1とカラム5が変更された履歴テーブルに保存します。私は以前の値を保存したい、おそらく私は元のテーブルから新しい値を選ぶことができます。どのように私はEFを使ってこれを行うことができます。私はこのようなものを探しています:http://stackoverflow.com/questions/6689291/history-in-database-using-entity-framework – DotnetSparrow

0

ActionFilterAttributeを継承するフィルタが好きなように聞こえます。私の場合、これは私が持っている最も単純な例です。これは私のモデルです。属性がデータベースへのマッピングを指示することに注意してください。私の場合は

[Table("UserProfile")] 
public class UserProfile 
{ 
    [Key, DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int UserId { get; set; } 

    public string UserName { get; set; } 
} 

それは歴史的ではなかったが、それは、次のように簡単だった:

public sealed class UsersContext : DbContext 
{ 
    public UsersContext() : base("DefaultConnection") 
    { 
    } 

    public DbSet<UserProfile> UserProfiles { get; set; } 
} 

public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     LazyInitializer.EnsureInitialized(ref _initializer, ref isInitialized, ref initializerLock); 
    } 

     public void CheckDatabase() 
     { 
      Database.SetInitializer<YourDBContextType>(null); 

      using (var context = new YourDBContextType()) 
      { 
       if (!context.Database.Exists()) 
       { 
         ((IObjectContextAdapter)context).ObjectContext.CreateDatabase(); 
       } 
      } 

// Uses your connection string to build the following table. 
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true); 
     } 

最終的な結果は、最初だけEFされているコードではないですが、またのために、あなたのモデルが可能になります複雑なエンティティから派生したプリミティブを使用するビューさて、あなたが別のものを持っている場合、歴史的なDBContextを言えば、テキスト変換ファイルを変更するか、エンティティの基本クラスを作成することをお勧めします。どちらの方法でも、テーブルに挿入してそのエンティティにフォローアップし、履歴モデルにクローンして保存することができるコードを簡単に生成できます。すべてのことが言われている、私は、フレームワークではなく、制約、トリガーなどに集中してデータベースの最初のアプローチのファンです。

関連する問題