我有一个项目,在这个项目中,我试图在重写SaveChanges方法之外对我的提子执行基本审计。当SaveChanges调用被包装在事务中时,我不想在那里执行审计。如果由于某种原因事务失败,我不想创建审计。
我正在考虑将审计转移到IDbCommandInterceptor NonQueryExecuted方法。这方面的问题是,在执行Save/Update/或Delete之后,该方法将被调用7或8次。
我还有别的地方可以把审计代码放进去吗?
编辑:我没有用SQL编写审计,所以回滚事务不会回滚审计。
发布于 2015-06-09 18:13:27
您可以编写代码将审核代码包装到事务中。您应该在审核服务中使用IEnlistmentNotification。
public class AuditingService: IEnlistmentNotification
{
private bool _isCommitSucceed = false;
private string _record;
public AuditingService(string record)
{
_record = record;
//init your audit
Transaction.Current.EnlistVolatile(this, EnlistmentOptions.None);
}
public void Commit(Enlistment enlistment)
{
//save audit record
_isCommitSucceed = true;
enlistment.Done();
}
public void InDoubt(Enlistment enlistment)
{
enlistment.Done();
}
public void Prepare(PreparingEnlistment preparingEnlistment)
{
preparingEnlistment.Prepared();
}
public void Rollback(Enlistment enlistment)
{
if (_isCommitSucceed))
{
//remove auditing record that was added in commit method
}
enlistment.Done();
}
}和使用:
using(var transaction = new TransactionScope())
{
//some code that save data to db
var auditor = new AuditingService("Save data to db");
transaction.Complete();
}https://stackoverflow.com/questions/30738565
复制相似问题