2016-03-26 11 views
0

私のエンティティのいくつかのアプリケーションでは、エンティティに変更情報(ユーザー名と変更時刻)を保存したいと考えています。それを達成するために、私はインターフェイスを作成しました。エンティティフレームワーク格納変更情報デザインの提案?

/// <summary> 
/// Marks a trackable entity 
/// </summary> 
public interface ITrackableEntity 
{ 
    /// <summary> 
    /// Gets or sets the date the entity was modified 
    /// </summary> 
    DateTime? ModifiedOn { get; set; } 

    /// <summary> 
    /// Gets or sets the user who modified the entity 
    /// </summary> 
    string ModifiedBy { get; set; } 
} 

このインターフェイスを実装する基本クラスを作成しました。

[Serializable] 
public abstract class BaseTrackableEntity : BaseEntity, ITrackableEntity 
{ 
    /// <summary> 
    /// Gets or sets the date the entity was modified 
    /// </summary> 
    public DateTime? ModifiedOn { get; set; } 
    /// <summary> 
    /// Gets or sets the user who modified the entity 
    /// </summary> 
    public string ModifiedBy { get; set; } 
} 

私はDbContextから継承されたと私は、次のようSaveChangesメソッド関数を上書きしている私自身のカスタムDbContextクラスを作成しました。

... 
foreach (DbEntityEntry entry in this.ChangeTracker.Entries()) 
{ 
    ... 
    ... 
    else if(entry.State == EntityState.Modified && entry.Entity is ITrackableEntity) 
    { 
     (entry.Entity as ITrackableEntity).ModifiedOn = DateTime.UtcNow; 
     (entry.Entity as ITrackableEntity).ModifiedBy = this._webHelper.GetLoggedInUserName(); 
    } 
} 
    ... 
return base.SaveChanges(); 

これは、実際に働いているが、私は、エンティティフレームワークに新しいですので、私は、これはそれを行うための最善の方法であることを確認していません。この時点で私の質問は、 このデザインは将来私に問題を引き起こすでしょうか?より良い解決策はありますか?

+0

この質問はcodereview.stackexchange.comでうまく収まるでしょう。 –

答えて

0

デザインはかなり良いですが、1つの潜在的な問題は、_webHelper.GetLogginInUserName()を使用してウェブレイヤーをデータベースレイヤーに結びつけていることです。一般的なルールとして、各レイヤーを別々に保つ必要があります。ウェブ以外のデータを使用してデータを保存する場合はどうなりますか?たとえば、WindowsサービスやWebAPIです。

当社のソリューションは、抽象基本クラスを作成することでした。

/// <summary> 
/// this holds all the standard auditing information. Any EF table 
/// with a UI should extend this class 
/// </summary> 
public abstract class AuditableTable 
{ 
    [Required] 
    [MaxLength(789)] 
    public string CreatedBy { get; set; } 

    public DateTimeOffset CreationDate { get; set; } 

    [MaxLength(789)] 
    public string ModifiedBy { get; set; } 

    public DateTimeOffset? ModifiedDate { get; set; } 
} 

これの欠点は、あなたが手動で監査情報を移入する必要があるということですが、逆に我々が直接ウェブサイトに結び付けられていないということですDataContextの組み込み保存メソッドをオーバーライドする必要はありませんでした。

+0

ヘッドアップしてくれてありがとう、ありがとう。私はDateTimeOffset構造についても知らなかった。 –

+0

日付の格納には2つのオプションがあります。すべてをUTCに変換するか、日付とともにタイムゾーンを格納します。我々は後者を選ぶ。 – jhilden

関連する問題