如何复制由ORM NHIBERNATE生成的SQL查询?

问题描述 投票:0回答:1
在使用NHIBERNATE和FLUENT NHIBERNATE的C#应用程序中,我们希望捕获某些插入,更新,删除在SQLite数据库上执行的查询,以复制它们。 我们只想复制某些影响某些实体类型的查询。

经过多次搜索和测试,我们还没有找到一种方法。 我们已经使用拦截器和听众开发了一个解决方案,但是似乎没有解决方案。 拦截器可用于检索生成的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,例如:

OnPrepareStatement

如果我已经正确阅读了文档,则拦截器是范围范围的,因此跟踪正确的环境存在一些潜在的问题,但值得探索。

绊脚石可能是在设置上下文之前调用

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); } }
c# sqlite nhibernate fluent-nhibernate replication
1个回答
0
投票

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.