2017-02-20 3 views
1

私のアプリケーションでは、EF6 データベースが最初に使用されていますアプローチです。データベース内のすべてのエンティティには、2つの共通プロパティ "CreatedDateTime"と "ModifiedDateTime"があります。Entity Framework 6の共通プロパティを暗黙的に設定しました

現在、私はSaveChanges()を使って、新しいエンティティを作成したり、既存のエンティティを更新している場合に、これらの2つのプロパティを明示的に設定します。

新しいエンティティが両方のプロパティを設定している場合は、それ以外の場合はModifiedDateTimeプロパティのみを設定します。

保存または更新操作でこれらの2つのプロパティを暗黙的に設定する方法があるかどうかを知りたかったのですが、

アップデート1
私は私がここでの本当の問題は、SaveChangesメソッドは、これら2つのプロパティへのアクセス権を持っている必要があるただしのSaveChanges()メソッドをオーバーライドする必要があります知っています。したがって、ここでは2つのオプションしか表示されません。
1エンティティにこれらのプロパティが設定されているかどうかを確認するためにリフレクションを使用します。
2>既定のT4世代を変更して、インターフェイスが定義済みのすべてのエンティティを派生させるようにします。そして、このインターフェイスは、これら2つのプロパティを持ちます。 SaveChanges()メソッドは、エンティティがこのインタフェースから派生しているかどうかをチェックし、プロパティを設定できます。

私は挑戦的にオプション1を使用したくないです。

DBの最初のアプローチでこれまでに他の方法がありましたか?あなたの第二のアプローチで行く

+0

http://stackoverflow.com/a/7041363/106866およびhttp://stackoverflow.com/a/7041323/106866 – jao

+0

を参照してください。最初のコードではなく、データベースの最初のアプローチ – LP13

+0

データベースでトリガーを設定することもできます – jao

答えて

3

:インタフェース(例えばIChangeTrack)への参照を含めるようにT4ファイルを調整します。

public interface IChangeTrack 
{ 
    /// <summary> 
    /// When has this entry be created 
    /// </summary> 
    [Required] 
    DateTime CreatedDateTime { get; set; } 

    /// <summary> 
    /// When has this entry been modified 
    /// </summary> 
    DateTime? ModifiedDateTime { get; set; } 
} 

は今、このような何かを行うことによって、あなたのSaveChanges()ルーチンを上書き:

/// <summary> 
/// Enhance save changes to handle system fields. 
/// </summary> 
/// <returns></returns> 
public override int SaveChanges() 
{ 
    HandleChanges(); 
    int changes = base.SaveChanges(); 
    return changes; 
} 

public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken) 
{ 
    HandleChanges(); 
    int changes = await base.SaveChangesAsync(cancellationToken); 
    return changes; 
} 


private void HandleChanges() 
{ 
    ChangeTracker.DetectChanges(); 
    var entries = ChangeTracker.Entries<IChangeTrack>(); 
    if (entries != null) 
    { 
     foreach (DbEntityEntry<IChangeTrack> entry in entries) 
     { 
      switch (entry.State) 
      { 
       case EntityState.Added: 
        entry.Entity.CreatedDateTime = DateTime.UtcNow 
        break; 
       case EntityState.Modified: 
        entry.Entity.ModifiedDateTime = DateTime.UtcNow; 
        break; 
      } 
     } 
    } 
} 
関連する問題