diff --git a/Directory.Build.props b/Directory.Build.props index 1719730d..f0b8ff92 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -10,7 +10,7 @@ - 3.2.601 + 3.2.602 diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index 02baeed9..fd4c629a 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -159,6 +159,13 @@ namespace base_entity public DateTime CreateTime { get; set; } } + + class CommandTimeoutCascade : IDisposable + { + public static AsyncLocal _asyncLocalTimeout = new AsyncLocal(); + public CommandTimeoutCascade(int timeout) => _asyncLocalTimeout.Value = timeout; + public void Dispose() => _asyncLocalTimeout.Value = 0; + } static void Main(string[] args) { #region 初始化 IFreeSql @@ -201,6 +208,21 @@ namespace base_entity BaseEntity.Initialization(fsql, () => _asyncUow.Value); #endregion + fsql.Aop.CommandBefore += (_, e) => + { + if (CommandTimeoutCascade._asyncLocalTimeout.Value > 0) + e.Command.CommandTimeout = CommandTimeoutCascade._asyncLocalTimeout.Value; + }; + + using (new CommandTimeoutCascade(1000)) + { + fsql.Select().ToList(); + fsql.Select().ToList(); + fsql.Select().ToList(); + } + + + fsql.UseJsonMap(); //var txt1 = fsql.Ado.Query<(string, string)>("select '꧁꫞꯭丑小鸭꫞꧂', '123123中国人' from dual"); diff --git a/FreeSql.DbContext/DbSet/DbSetAsync.cs b/FreeSql.DbContext/DbSet/DbSetAsync.cs index 884c4485..d90c657d 100644 --- a/FreeSql.DbContext/DbSet/DbSetAsync.cs +++ b/FreeSql.DbContext/DbSet/DbSetAsync.cs @@ -80,8 +80,9 @@ namespace FreeSql Attach(data); if (_db.Options.EnableAddOrUpdateNavigateList) await AddOrUpdateNavigateListAsync(data, true, null, cancellationToken); + return; } - return; + break; } } EnqueueToDbContext(DbContext.EntityChangeType.Insert, CreateEntityState(data)); @@ -124,21 +125,22 @@ namespace FreeSql await AddOrUpdateNavigateListAsync(item, true, null, cancellationToken); return; default: - foreach (var s in data) - await AddPrivAsync(s, false, cancellationToken); - return; + if (_tableIdentitys.Length == 1 && _tableReturnColumns.Length == 1) + { + foreach (var s in data) + await AddPrivAsync(s, false, cancellationToken); + return; + } + break; } } - else - { - //进入队列,等待 SaveChanges 时执行 + //进入队列,等待 SaveChanges 时执行 + foreach (var item in data) + EnqueueToDbContext(DbContext.EntityChangeType.Insert, CreateEntityState(item)); + AttachRange(data); + if (_db.Options.EnableAddOrUpdateNavigateList) foreach (var item in data) - EnqueueToDbContext(DbContext.EntityChangeType.Insert, CreateEntityState(item)); - AttachRange(data); - if (_db.Options.EnableAddOrUpdateNavigateList) - foreach (var item in data) - await AddOrUpdateNavigateListAsync(item, true, null, cancellationToken); - } + await AddOrUpdateNavigateListAsync(item, true, null, cancellationToken); } async public Task SaveManyAsync(TEntity item, string propertyName, CancellationToken cancellationToken = default) diff --git a/FreeSql.DbContext/DbSet/DbSetSync.cs b/FreeSql.DbContext/DbSet/DbSetSync.cs index 3fb6eaba..cd1178a0 100644 --- a/FreeSql.DbContext/DbSet/DbSetSync.cs +++ b/FreeSql.DbContext/DbSet/DbSetSync.cs @@ -79,8 +79,9 @@ namespace FreeSql Attach(data); if (_db.Options.EnableAddOrUpdateNavigateList) AddOrUpdateNavigateList(data, true, null); + return; } - return; + break; } } EnqueueToDbContext(DbContext.EntityChangeType.Insert, CreateEntityState(data)); @@ -127,21 +128,22 @@ namespace FreeSql AddOrUpdateNavigateList(item, true, null); return; default: - foreach (var s in data) - AddPriv(s, false); - return; + if (_tableIdentitys.Length == 1 && _tableReturnColumns.Length == 1) + { + foreach (var s in data) + AddPriv(s, false); + return; + } + break; } } - else - { - //进入队列,等待 SaveChanges 时执行 + //进入队列,等待 SaveChanges 时执行 + foreach (var item in data) + EnqueueToDbContext(DbContext.EntityChangeType.Insert, CreateEntityState(item)); + AttachRange(data); + if (_db.Options.EnableAddOrUpdateNavigateList) foreach (var item in data) - EnqueueToDbContext(DbContext.EntityChangeType.Insert, CreateEntityState(item)); - AttachRange(data); - if (_db.Options.EnableAddOrUpdateNavigateList) - foreach (var item in data) - AddOrUpdateNavigateList(item, true, null); - } + AddOrUpdateNavigateList(item, true, null); } /// diff --git a/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs index 0ac06d24..c2743d4e 100644 --- a/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs @@ -1718,6 +1718,10 @@ WHERE (((to_char(a.""ID"")) in (SELECT b.""TITLE"" Assert.Equal(2, g.oracle.Select().Where(a => a.name.StartsWith("name")).ToDelete().ExecuteAffrows()); Assert.Equal(3, g.oracle.Select().Count()); Assert.Equal(3, g.oracle.Select().Where(a => a.name.StartsWith("nick")).Count()); + Assert.Equal(2, g.oracle.Select().OrderBy(a => a.name).Limit(2).ToDelete().ExecuteAffrows()); + Assert.Equal(1, g.oracle.Select().Count()); + Assert.Equal(1, g.oracle.Select().Where(a => a.name.StartsWith("nick")).Count()); + Assert.Equal("nick3", g.oracle.Select().ToList()[0].name); g.oracle.Select().ToDelete().ExecuteAffrows(); Assert.Equal(0, g.oracle.Select().Count());