经过多次搜索和测试,我们还没有找到一种方法。 我们已经使用拦截器和听众开发了一个解决方案,但是似乎没有解决方案。 拦截器可用于检索生成的SQL,但我们缺乏其应用的上下文。 听众(ipostinserteventlistener,ipostupdateeventlistener,ipostdeleteeeventlistener)有更多参数,但是我们找不到一种方法来检索RAW SQL查询。
通过覆盖inter来使用拦截器是最简单的方法,但是它缺乏执行操作的实体的上下文。OnPrepareStatement(SqlString sql)
public override SqlString OnPrepareStatement(SqlString sql)
{
// Only raw SQL
Console.WriteLine(sql);
return base.OnPrepareStatement(sql);
}
,我们获得了更多信息,我们可以理解正在修改的上下文和实体,但是我们找不到生成的SQL。
Listeners
codeally,我们想复制Syncframework提出的三角洲机制(Https://github.com/egarim/syncframework/tree/main-)。提前感谢您的帮助!
在拦截器中保留某种形式的上下文?如果方法调用的顺序兼容并设置上下文,则在调用
public class QueryListener(Configuration cfg) : IPreUpdateEventListener, IPostUpdateEventListener, IPreInsertEventListener, IPostInsertEventListener
{
public void Register()
{
cfg.EventListeners.PreUpdateEventListeners = [.. cfg.EventListeners.PreUpdateEventListeners, this];
cfg.EventListeners.PostUpdateEventListeners = [.. cfg.EventListeners.PostUpdateEventListeners, this];
cfg.EventListeners.PreInsertEventListeners = [.. cfg.EventListeners.PreInsertEventListeners, this];
cfg.EventListeners.PostInsertEventListeners = [.. cfg.EventListeners.PostInsertEventListeners, this];
}
public void OnPostUpdate(PostUpdateEvent @event)
{
// Capture SQL here ?
}
public bool OnPreUpdate(PreUpdateEvent @event)
{
// Capture SQL here ?
return false;
}
public bool OnPreInsert(PreInsertEvent @event)
{
// Capture SQL here ?
return false;
}
public void OnPostInsert(PostInsertEvent @event)
{
// Capture SQL here ?
}
#region Async methods
public Task OnPostUpdateAsync(PostUpdateEvent @event, CancellationToken cancellationToken)
{
OnPostUpdate(@event);
return Task.CompletedTask;
}
public Task<bool> OnPreUpdateAsync(PreUpdateEvent @event, CancellationToken cancellationToken)
{
return Task.FromResult(OnPreUpdate(@event));
}
public Task<bool> OnPreInsertAsync(PreInsertEvent @event, CancellationToken cancellationToken)
{
return Task.FromResult(OnPreInsert(@event));
}
public Task OnPostInsertAsync(PostInsertEvent @event, CancellationToken cancellationToken)
{
OnPostInsert(@event);
return Task.CompletedTask;
}
#endregion
}
方法时可用。
thim,例如:如果我已经正确阅读了文档,则拦截器是范围范围的,因此跟踪正确的环境存在一些潜在的问题,但值得探索。
绊脚石可能是在设置上下文之前调用
public class SqlLoggingInterceptor : EmptyInterceptor {
private object _currentEntity;
public override bool OnSave(object entity,
object id,
object[] state,
string[] propertyNames,
IType[] types)
{
_currentEntity = entity;
return true;
}
public override SqlString OnPrepareStatement(SqlString sql)
{
// Use _currentEntity here
return base.OnPrepareStatement(sql);
}
}