我认为这是一个很好的功能,所以我只是 added support for Insert and Update Filters to OrmLite。所以现在你可以配置一个全局更新或插入过滤器:
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;
}
};
所以现在 Created 和 Modified 日期字段将在实现 IAudit 并插入到任何 OrmLite 的 Typed API 的每一行上更新(即不是动态 SQL 或使用匿名类型的部分更新),例如:
表定义
public class AuditTableA : IAudit
{
[AutoIncrement]
public int Id { get; set; }
public DateTime CreatedDate { get; set; }
public DateTime ModifiedDate { get; set; }
public string ModifiedBy { get; set; }
}
public class AuditTableB : IAudit
{
[AutoIncrement]
public int Id { get; set; }
public DateTime CreatedDate { get; set; }
public DateTime ModifiedDate { get; set; }
public string ModifiedBy { get; set; }
}
var a = new AuditTableA();
var b = new AuditTableB();
db.Save(a);
db.Save(b);
var insertRowA = db.SingleById<AuditTableA>(a.Id);
var insertRowB = db.SingleById<AuditTableB>(b.Id);
//both insertRowA/insertRowB CreatedDate/ModifiedDate fields populated
验证
过滤器也可用于验证,抛出异常将阻止操作并冒泡异常,例如:
OrmLiteConfig.InsertFilter = OrmLiteConfig.UpdateFilter = (dbCmd, row) =>
{
var auditRow = row as IAudit;
if (auditRow != null)
{
if (auditRow.ModifiedBy == null)
throw new ArgumentNullException("ModifiedBy");
}
};
try
{
db.Insert(new AuditTableA());
}
catch (ArgumentNullException) {
//throws ArgumentNullException
}
db.Insert(new AuditTableA { ModifiedBy = "Me!" }); //succeeds
此功能现已在 ServiceStack's MyGet feed 中提供,并将在 NuGet 上的下一个 v4.0.11+ 版本中提供。