基于class接口的自定义ormlite查询实现

Custom ormlite query implementation based on class interface

我想根据对象的实现扩展某些 ORMLite 方法。例如,

我有一个界面:

public interface IHaveTimestamps 
{
    DateTime CreatedOn { get; set; }
    DateTime UpdatedOn { get; set; }
}

现在我只想在 T 实现 IHaveTimestamps 时重写 Db.Insert<T>() 方法,对于 T 的其他实例,它应该基于 Insert 执行 Insert默认行为。

这样我就可以集中设置 CreatedOn 和 UpdatedOn 值,而不是在任何地方手动设置。

我可以通过重载 Insert/Update 方法来做到这一点吗,这样我需要做的就是更新模型以从接口继承,所有数据库操作都会自行处理,或者我需要做这样的事情:

public static class DbExtensions
{
    public static long MyInsert<T> (this IDbConnection dbConn, T obj, bool selectIdentity = false) where T : IHaveTimestamps {
        obj.CreatedOn = DateTime.UtcNow;
        obj.UpdatedOn = DateTime.UtcNow;
        return dbConn.Insert<T>(obj);
    }

    public static long MyUpdate<T> (this IDbConnection dbConn, T obj) where T : IHaveTimestamps {
        obj.UpdatedOn = DateTime.UtcNow;
        return dbConn.Update<T>(obj);
    }
}

看看 OrmLite Global Insert/Update Filters 它已经允许你做这样的事情,例如:

public interface IAudit 
{
    DateTime CreatedDate { get; set; }
    DateTime ModifiedDate { get; set; }
    string ModifiedBy { get; set; }
}

OrmLiteConfig.InsertFilter = (dbCmd, row) => {
    var auditRow = row as IAudit;
    if (auditRow != null)
        auditRow.CreatedDate = auditRow.ModifiedDate = DateTime.UtcNow;
};

OrmLiteConfig.UpdateFilter = (dbCmd, row) => {
    var auditRow = row as IAudit;
    if (auditRow != null)
        auditRow.ModifiedDate = DateTime.UtcNow;
};