From 87c71d5be3b1963196b174dbcb757ba012a7d301 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Sun, 24 Apr 2022 16:11:18 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20InsertValueSql=20?= =?UTF-8?q?=E5=9C=A8=E4=BB=93=E5=82=A8=E6=8F=92=E5=85=A5=E5=90=8E=E4=B8=8D?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E6=9C=80=E6=96=B0=E5=80=BC=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Examples/base_entity/Program.cs | 26 +++++++++++++++++++ FreeSql.DbContext/DbSet/DbSet.cs | 6 ++--- FreeSql.DbContext/DbSet/DbSetAsync.cs | 6 ++--- FreeSql.DbContext/DbSet/DbSetSync.cs | 6 ++--- .../RepositoryTests.cs | 9 ++++--- 5 files changed, 40 insertions(+), 13 deletions(-) diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index 2939a230..dda3e9bb 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -6,6 +6,7 @@ using FreeSql.Internal.Model; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Data.Odbc; using System.Data.SqlClient; @@ -230,6 +231,31 @@ namespace base_entity CouponIds = a.CouponIds }); + int LocalConcurrentDictionaryIsTypeKey(Type dictType, int level = 1) + { + if (dictType.IsGenericType == false) return 0; + if (dictType.GetGenericTypeDefinition() != typeof(ConcurrentDictionary<,>)) return 0; + var typeargs = dictType.GetGenericArguments(); + if (typeargs[0] == typeof(Type) || typeargs[0] == typeof(ColumnInfo) || typeargs[0] == typeof(TableInfo)) return level; + if (level > 2) return 0; + return LocalConcurrentDictionaryIsTypeKey(typeargs[1], level + 1); + } + + var fds = typeof(FreeSql.Internal.Utils).GetFields(BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public) + .Where(a => LocalConcurrentDictionaryIsTypeKey(a.FieldType) > 0).ToArray(); + var ttypes1 = typeof(IFreeSql).Assembly.GetTypes().Select(a => new + { + Type = a, + ConcurrentDictionarys = a.GetFields(BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public) + .Where(b => LocalConcurrentDictionaryIsTypeKey(b.FieldType) > 0).ToArray() + }).Where(a => a.ConcurrentDictionarys.Length > 0).ToArray(); + var ttypes2 = typeof(IBaseRepository).Assembly.GetTypes().Select(a => new + { + Type = a, + ConcurrentDictionarys = a.GetFields(BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public) + .Where(b => LocalConcurrentDictionaryIsTypeKey(b.FieldType) > 0).ToArray() + }).Where(a => a.ConcurrentDictionarys.Length > 0).ToArray(); + #region pgsql poco // fsql.Aop.ParseExpression += (_, e) => // { diff --git a/FreeSql.DbContext/DbSet/DbSet.cs b/FreeSql.DbContext/DbSet/DbSet.cs index a0326c5f..12d1cdd9 100644 --- a/FreeSql.DbContext/DbSet/DbSet.cs +++ b/FreeSql.DbContext/DbSet/DbSet.cs @@ -127,9 +127,9 @@ namespace FreeSql protected ConcurrentDictionary _states = new ConcurrentDictionary(); TableInfo _tablePriv; protected TableInfo _table => _tablePriv ?? (_tablePriv = _db.OrmOriginal.CodeFirst.GetTableByEntity(_entityType)); - ColumnInfo[] _tableIdentitysPriv, _tableServerTimesPriv; + ColumnInfo[] _tableIdentitysPriv, _tableReturnColumnsPriv; protected ColumnInfo[] _tableIdentitys => _tableIdentitysPriv ?? (_tableIdentitysPriv = _table.Primarys.Where(a => a.Attribute.IsIdentity).ToArray()); - protected ColumnInfo[] _tableServerTimes => _tableServerTimesPriv ?? (_tableServerTimesPriv = _table.Primarys.Where(a => a.Attribute.ServerTime != DateTimeKind.Unspecified).ToArray()); + protected ColumnInfo[] _tableReturnColumns => _tableReturnColumnsPriv ?? (_tableReturnColumnsPriv = _table.ColumnsByPosition.Where(a => a.Attribute.IsPrimary && a.Attribute.IsIdentity || string.IsNullOrWhiteSpace(a.DbInsertValue) == false).ToArray()); protected Type _entityType = typeof(TEntity); public Type EntityType => _entityType; @@ -146,7 +146,7 @@ namespace FreeSql _entityType = entityType; _tablePriv = newtb ?? throw new Exception("DbSet.AsType 参数错误,请传入正确的实体类型"); _tableIdentitysPriv = null; - _tableServerTimesPriv = null; + _tableReturnColumnsPriv = null; return this; } diff --git a/FreeSql.DbContext/DbSet/DbSetAsync.cs b/FreeSql.DbContext/DbSet/DbSetAsync.cs index 71b71e55..87c5fb89 100644 --- a/FreeSql.DbContext/DbSet/DbSetAsync.cs +++ b/FreeSql.DbContext/DbSet/DbSetAsync.cs @@ -33,7 +33,7 @@ namespace FreeSql async Task AddPrivAsync(TEntity data, bool isCheck, CancellationToken cancellationToken) { if (isCheck && CanAdd(data, true) == false) return; - if (_tableIdentitys.Length > 0) + if (_tableReturnColumns.Length > 0) { //有自增,马上执行 switch (_db.OrmOriginal.Ado.DataType) @@ -46,7 +46,7 @@ namespace FreeSql case DataType.OdbcKingbaseES: case DataType.ShenTong: case DataType.Firebird: //firebird 只支持单条插入 returning - if (_tableIdentitys.Length == 1) + if (_tableIdentitys.Length == 1 && _tableReturnColumns.Length == 1) { await DbContextFlushCommandAsync(cancellationToken); var idtval = await this.OrmInsert(data).ExecuteIdentityAsync(cancellationToken); @@ -98,7 +98,7 @@ namespace FreeSql await AddAsync(data.First(), cancellationToken); return; } - if (_tableIdentitys.Length > 0) + if (_tableReturnColumns.Length > 0) { //有自增,马上执行 switch (_db.OrmOriginal.Ado.DataType) diff --git a/FreeSql.DbContext/DbSet/DbSetSync.cs b/FreeSql.DbContext/DbSet/DbSetSync.cs index d01aff49..6906265e 100644 --- a/FreeSql.DbContext/DbSet/DbSetSync.cs +++ b/FreeSql.DbContext/DbSet/DbSetSync.cs @@ -32,7 +32,7 @@ namespace FreeSql void AddPriv(TEntity data, bool isCheck) { if (isCheck && CanAdd(data, true) == false) return; - if (_tableIdentitys.Length > 0) + if (_tableReturnColumns.Length > 0) { //有自增,马上执行 switch (_db.OrmOriginal.Ado.DataType) @@ -45,7 +45,7 @@ namespace FreeSql case DataType.OdbcKingbaseES: case DataType.ShenTong: case DataType.Firebird: //firebird 只支持单条插入 returning - if (_tableIdentitys.Length == 1) + if (_tableIdentitys.Length == 1 && _tableReturnColumns.Length == 1) { DbContextFlushCommand(); var idtval = this.OrmInsert(data).ExecuteIdentity(); @@ -101,7 +101,7 @@ namespace FreeSql Add(data.First()); return; } - if (_tableIdentitys.Length > 0) + if (_tableReturnColumns.Length > 0) { //有自增,马上执行 switch (_db.OrmOriginal.Ado.DataType) diff --git a/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests.cs b/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests.cs index 00eba288..5d116f7e 100644 --- a/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests.cs +++ b/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests.cs @@ -596,8 +596,9 @@ namespace FreeSql.Tests [Fact] public void BeginEditIdentity() { - g.sqlite.Delete().Where("1=1").ExecuteAffrows(); - var repo = g.sqlite.GetRepository(); + var fsql = g.sqlserver; + fsql.Delete().Where("1=1").ExecuteAffrows(); + var repo = fsql.GetRepository(); var cts = new[] { new BeginEdit02 { Name = "1" }, new BeginEdit02 { Name = "1_1" }, @@ -617,8 +618,8 @@ namespace FreeSql.Tests Assert.Equal(3, repo.EndEdit()); - g.sqlite.Delete().Where("1=1").ExecuteAffrows(); - repo = g.sqlite.GetRepository(); + fsql.Delete().Where("1=1").ExecuteAffrows(); + repo = fsql.GetRepository(); cts = repo.Select.ToList(); repo.BeginEdit(cts);