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);
}
}
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) –
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