DotNetNext / SqlSugar

.Net aot ORM Fastest ORM Simple Easy VB.NET Sqlite orm Oracle ORM Mysql Orm 虚谷数据库 postgresql ORm SqlServer oRm 达梦 ORM 人大金仓 ORM 神通ORM C# ORM , C# ORM .NET ORM NET5 ORM .NET6 ORM ClickHouse orm QuestDb ,TDengine ORM,OceanBase orm,GaussDB orm ,Tidb orm Object/Relational Mapping
https://www.donet5.com/Home/Doc
MIT License
5.24k stars 1.33k forks source link

SqlSugarScope的Aop在QuartzJob內失效 #1128

Closed Yumitoya8569 closed 1 year ago

Yumitoya8569 commented 1 year ago

環境

.Net 7 Oracle 11g SqlSugarCore 5.1.3.51

問題

DbFactory類別為單例注入並使用UseDB取得連線(實際情況會切換連線, 這裡簡化) 分別測試過(A)、(B)、(C)、(D) 4種設定方式 在Quartz的Job內使用查詢均無進入OnLogExecuting 補充: 這是WebApi專案, Quartz在初始化後跑在背景執行續

public class DbFactory
{
        private static SqlSugarScope _db =  new SqlSugarScope(new ConnectionConfig()
        {
            ConfigId = "System",
            DbType = SqlSugar.DbType.Oracle,
            ConnectionString = "MyConnectionString...",
            IsAutoCloseConnection = true
        }, d => {
            // (A)
            d.Aop.OnLogExecuting =  (sql, p) =>
            {
                System.Diagnostics.Debug.WriteLine("{0}", sql);
            };

            // (B)
            d.GetConnection("System").Aop.OnLogExecuting =  (sql, p) =>
            {
                System.Diagnostics.Debug.WriteLine("{0}", sql);
            };

            // (C)
            d.GetConnectionScope("System").Aop.OnLogExecuting =  (sql, p) =>
            {
                System.Diagnostics.Debug.WriteLine("{0}", sql);
            };
        });

        public DbFactory()
        {
        }

        public SqlSugarScopeProvider UseDB()
        {
            var connScope = _db.GetConnectionScope("System");

            // (D)
            connScope.Aop.OnLogExecuting =  (sql, p) =>
            {
                System.Diagnostics.Debug.WriteLine("{0}", sql);
            };

            return connScope;
        }       
}
DotNetNext commented 1 year ago

你这个情况需提供完整的DEMO,并且我这边能重现的。

DotNetNext commented 1 year ago

C应该是对象的,其他都是错的

DotNetNext commented 1 year ago

你可以打个断点看一下,是不是断点有没有进来

Yumitoya8569 commented 1 year ago

稍微補充一下:

  1. 實際上在ApiController的HttpGet方法調用, 以上設置都能生效 我知道(C)是建議的, 順便建議調整一下文檔2.1的範例代碼https://www.donet5.com/home/Doc?typeId=1181 //db.GetConnection(i).Aop

  2. 斷點有測試過, configAction有執行, 但如果斷在OnLogExecuting內永遠不會執行

  3. 後續會補上能重現的DEMO

DotNetNext commented 1 year ago

image

这样写就可以了,因为初始的线程和 执行队列的线程不是一个方法

DotNetNext commented 1 year ago

把GetConnectionScope在方法内获取就能到AOP了

DotNetNext commented 1 year ago

不要在构造函数,因为构造函数是静态的

DotNetNext commented 1 year ago

image

DotNetNext commented 1 year ago

image

DotNetNext commented 1 year ago

如果还有疑问,我把我的DEMO给你,我这边按我这么写可以执行

Yumitoya8569 commented 1 year ago

謝謝, 我有機會會測試一下

~~另外我想了解一下這個問題是基於muti-thread觸發嗎? 內部原理是什麼? 因為運用面上很難避免構造函數, 想了解一下原理看有沒有機會繞過~~

測試後我已經理解了, Quartz.Net 初始job物件跟執行job的是不同thread導致判定為不同上下文 謝謝協助

DotNetNext commented 1 year ago

那就先关闭了,还有问题在新开一个isssue