2016-10-24 4 views
0

Diese Frage soll etwas Licht bringen um Kontrolldatum mal mit Dapper.Dapper Kontrolldaten

Diese Steuerelemente werden verwendet, um die Informationen in einem Datenspeicher zu überprüfen und herauszufinden, wann eine bestimmte Zeile erstellt/aktualisiert wurde. Ich konnte keine Informationen über das Projekt GitHub's hier in StackOverflow finden, daher möchte ich, dass dieser Beitrag eine zentrale Quelle der Wahrheit wird, um anderen zu helfen oder sogar eine zukünftige Erweiterung der Bibliothek zu werden.

Jede Antwort, Ressource oder Best Practice wird geschätzt.

+0

Datumsstempel Aufzeichnungen für die Erstellung und Updates ist die Verantwortung für Ihre Anwendung implementieren Sie mit Dapper, entweder in Ihrem App-Code oder in der SQL-Datenbank. Dapper ist nur der Objekt-Mapper zwischen Ihrem Code und Ihrer Datenbank. Sie suchen am besten nach SQL-Triggern (https://weblogs.asp.net/jongalloway/adding-simple-trigger-based-auditing-to-your-sql-server-database) oder anderen Datenbankmethoden zum Erstellen von Audit-Trails (http://stackoverflow.com/questions/17546601/best-way-to-implement-an-audit-trail-in-sql-server) –

+0

Hier sind einige Informationen für Sie zur Lösung in SQL Server. http://stackoverflow.com/questions/17116334/sql-server-2008-row-insert-and-update-timestamps – JFM

Antwort

0

Ich bin in einen Fall geraten, in dem ich mit einer Datenbank arbeitete, die von Rails und Dapper verbraucht wurde. Rails verwaltete created_at und updated_at, nicht die Datenbank. Also musste ich mit der .net-Anwendung eine Lösung implementieren, die diese verwaltete und die Möglichkeit bot, zusätzliche Geschäftslogik auf diesen Layern wie beispielsweise Ereignissen hinzuzufügen.

Ich habe ein grundlegendes Beispiel, wie ich dies mit einem Wrapper um Dapper Simple Crud für Einsätze und Updates behandelt. In diesem Beispiel werden die anderen kritischen Methoden nicht von dapper und simplecrud wie Query, GET, Delete usw. angezeigt. Sie müssen diese an Ihrer Diskretion offen legen.

Für die Sicherheit gewährleisten, dass Sie Ihre Modelle created_at Eigenschaft mit dem Attribut schmücken [Dapper.IgnoreUpdate]

[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

danke für das Beispiel @Zabbu – Rober