2016-10-24 4 views
0

この質問は、Dapperを使用しての管理日時を少し光らせます。ダッパーの管理日

これらのコントロールは、データストレージ内の情報を監査するために使用され、特定の行が作成/更新されたときに把握されます。私はGitHub'sプロジェクトの情報をStackOverflowで見つけることはできませんでした。この記事は、他の人を助けるために、あるいは将来の図書館の拡張になる真実の中心源になりたいと思います。

すべての回答、リソース、またはベストプラクティスは高く評価されます。

+0

日は、あなたがいずれかのあなたに、Dapperのを実装し、アプリケーションのより責任ある[Dapper.IgnoreUpdate]あなたは属性とプロパティのcreated_atモデルを飾ることを確認してくださいアプリケーションコードまたはSQLデータベースに格納されます。 Dapperはコードとデータベースの間のオブジェクトマッパーです。 SQLトリガー(https://weblogs.asp.net/jongalloway/adding-simple-trigger-based-auditing-to-your-sql-server-database)や監査証跡を作成する他のデータベース方法(http://stackoverflow.com/questions/17546601/best-way-to-implement-an-audit-trail-in-sql-server) –

+0

ここでは、SQL Serverでそれを解決するためのいくつかの情報です。 http://stackoverflow.com/questions/17116334/sql-server-2008-row-insert-and-update-timestamps – JFM

答えて

0

私は、RailsとDapperの両方で使用されていたデータベースを使って作業していました。 Railsはデータベースではなく、created_atとupdated_atを管理していました。だから.netアプリケーションでは、これらを管理するソリューションを実装しなければならず、イベントなどのこれらのレイヤーでビジネスロジックを追加する機能が提供されました。

私はこれをDapper Simple Crudのラッパーでどのように処理して挿入と更新を行うかの基本例を示しました。この例では、query、GET、Deleteなどの他の重要なメソッドをdapperやsimplecrudから公開することは含まれていません。あなたはそれらをあなたのdiscissionで公開する必要があります。安全のために

作成と更新のためにレコードをスタンプ

[Table("examples")] 
public partial class example 
{ 
    [Key] 
    public virtual int id { get; set; } 
    [Required(AllowEmptyStrings = false)] 
    [StringLength(36)] 
    public virtual string name { get; set; } 
    [Dapper.IgnoreUpdate] 
    public virtual DateTime created_at { get; set; } 
    public virtual DateTime updated_at { get; set; } 
} 

public class ExampleRepository : IExampleRepository 
{ 
    private readonly IYourDapperWrapper db; 

    public PartnerRepository(IYourDapperWrapper yourDapperWrapper){ 
     if (yourDapperWrapper == null) throw new ArgumentNullException(nameof(yourDapperWrapper)); 
     db = yourDapperWrapper; 
    } 

    public void Update(example exampleObj) 
    { 
     db.Update(exampleObj); 
    } 

    public example Create(example exampleObj) 
    { 
     var result = db.Insert(exampleObj); 
     if (result.HasValue) exampleObj.id = result.value; 
     return exampleObj; 
    } 
} 

public class YourDapperWrapper : IYourDapperWrapper 
{ 
    private IDbConnectionFactory db; 

    public YourDapperWrapper(IDbConnectionFactory dbConnectionFactory){ 
     if (dbConnectionFactory == null) throw new ArgumentNullException(nameof(dbConnectionFactory)); 
     db = dbConnectionFactory; 
    } 

    public int Insert(object model, IDbTransaction transaction = null, int? commandTimeout = null) 
    { 
     DateUpdate(model, true); 
     var results = Db.NewConnection().Insert(model, transaction, commandTimeout); 
     if (!results.HasValue || results == 0) throw new DataException("Failed to insert object."); 
     return results; 
    } 

    public int Update(object model, IDbTransaction transaction = null, int? commandTimeout = null) 
    { 
     DateUpdate(model, false); 
     var results = Db.NewConnection().Update(model, transaction, commandTimeout); 
     if (!results.HasValue || results == 0) throw new DataException("Failed to update object.");  
     return results; 
    } 

    private void DateUpdate(object model, bool isInsert) 
    { 
     model.GetType().GetProperty("updated_at")?.SetValue(model, DateTime.UtcNow, null); 
     if (isInsert) model.GetType().GetProperty("created_at")?.SetValue(model, DateTime.UtcNow, null); 
    } 
} 
+0

例のおかげで@ザブブ – Rober

関連する問題