From c33d8c6d3922a0d96e952da488d0ba9a1b9716d9 Mon Sep 17 00:00:00 2001 From: xuna Date: Tue, 26 Jul 2022 20:06:26 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=AE=9E=E4=BD=93?= =?UTF-8?q?=E5=AF=B9=E8=B1=A1=E6=97=A0=E7=A9=BA=E6=9E=84=E9=80=A0=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E6=97=B6=E9=80=9A=E8=BF=87Repository=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E5=BC=95=E5=8F=91=E5=BC=82=E5=B8=B8=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98,=E5=A2=9E=E5=8A=A0Lazy=E6=94=B9=E8=BF=9B=E5=B9=B6?= =?UTF-8?q?=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.DbContext/DbSet/DbSet.cs | 6 +++--- FreeSql.DbContext/DbSet/DbSetAsync.cs | 2 +- FreeSql.DbContext/DbSet/DbSetSync.cs | 2 +- .../Repository/Repository/BaseRepository.cs | 2 +- FreeSql/Extensions/FreeSqlGlobalExtensions.cs | 19 ++++++++++++------- 5 files changed, 18 insertions(+), 13 deletions(-) diff --git a/FreeSql.DbContext/DbSet/DbSet.cs b/FreeSql.DbContext/DbSet/DbSet.cs index f462dbd0..03936ff0 100644 --- a/FreeSql.DbContext/DbSet/DbSet.cs +++ b/FreeSql.DbContext/DbSet/DbSet.cs @@ -219,7 +219,7 @@ namespace FreeSql public DbSet AttachOnlyPrimary(TEntity data) { if (data == null) return this; - var pkitem = (TEntity)Activator.CreateInstance(_entityType); + var pkitem = (TEntity)_entityType.CreateInstanceGetDefaultValue(); foreach (var pk in _db.OrmOriginal.CodeFirst.GetTableByEntity(_entityType).Primarys) { var colVal = _db.OrmOriginal.GetEntityValueWithPropertyName(_entityType, data, pk.CsName); @@ -267,8 +267,8 @@ namespace FreeSql { if (data == null) throw new ArgumentNullException(nameof(data)); var key = _db.OrmOriginal.GetEntityKeyString(_entityType, data, false); - var state = new EntityState((TEntity)Activator.CreateInstance(_entityType), key); - _db.OrmOriginal.MapEntityValue(_entityType, data, state.Value); + var state = new EntityState((TEntity)_entityType.CreateInstanceGetDefaultValue(), key); + _db.OrmOriginal.MapEntityValue(_entityType, data, state.Value); return state; } bool? ExistsInStates(TEntity data) diff --git a/FreeSql.DbContext/DbSet/DbSetAsync.cs b/FreeSql.DbContext/DbSet/DbSetAsync.cs index 76889230..8ecea3cc 100644 --- a/FreeSql.DbContext/DbSet/DbSetAsync.cs +++ b/FreeSql.DbContext/DbSet/DbSetAsync.cs @@ -312,7 +312,7 @@ namespace FreeSql midSet.RemoveRange(midListDel); //删除未保存的项 foreach (var curItem in curList) { - var newItem = Activator.CreateInstance(tref.RefMiddleEntityType); + var newItem = tref.RefMiddleEntityType.CreateInstanceGetDefaultValue(); for (var colidx = 0; colidx < tref.Columns.Count; colidx++) { var val = FreeSql.Internal.Utils.GetDataReaderValue(tref.MiddleColumns[colidx].CsType, _db.OrmOriginal.GetEntityValueWithPropertyName(_table.Type, item, tref.Columns[colidx].CsName)); diff --git a/FreeSql.DbContext/DbSet/DbSetSync.cs b/FreeSql.DbContext/DbSet/DbSetSync.cs index f17eee5d..3545ffb0 100644 --- a/FreeSql.DbContext/DbSet/DbSetSync.cs +++ b/FreeSql.DbContext/DbSet/DbSetSync.cs @@ -323,7 +323,7 @@ namespace FreeSql midSet.RemoveRange(midListDel); //删除未保存的项 foreach (var curItem in curList) { - var newItem = Activator.CreateInstance(tref.RefMiddleEntityType); + var newItem = tref.RefMiddleEntityType.CreateInstanceGetDefaultValue(); for (var colidx = 0; colidx < tref.Columns.Count; colidx++) { var val = FreeSql.Internal.Utils.GetDataReaderValue(tref.MiddleColumns[colidx].CsType, _db.OrmOriginal.GetEntityValueWithPropertyName(_table.Type, item, tref.Columns[colidx].CsName)); diff --git a/FreeSql.DbContext/Repository/Repository/BaseRepository.cs b/FreeSql.DbContext/Repository/Repository/BaseRepository.cs index 6d50b459..da97a6b8 100644 --- a/FreeSql.DbContext/Repository/Repository/BaseRepository.cs +++ b/FreeSql.DbContext/Repository/Repository/BaseRepository.cs @@ -197,7 +197,7 @@ namespace FreeSql var tb = _db.OrmOriginal.CodeFirst.GetTableByEntity(EntityType); if (tb.Primarys.Length != 1) throw new Exception(DbContextStrings.EntityType_PrimaryKeyIsNotOne(EntityType.Name)); if (tb.Primarys[0].CsType.NullableTypeOrThis() != typeof(TKey).NullableTypeOrThis()) throw new Exception(DbContextStrings.EntityType_PrimaryKeyError(EntityType.Name, typeof(TKey).FullName)); - var obj = Activator.CreateInstance(tb.Type); + var obj = tb.Type.CreateInstanceGetDefaultValue(); _db.OrmOriginal.SetEntityValueWithPropertyName(tb.Type, obj, tb.Primarys[0].CsName, id); var ret = obj as TEntity; if (ret == null) throw new Exception(DbContextStrings.EntityType_CannotConvert(EntityType.Name, typeof(TEntity).Name)); diff --git a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs index 2bfede75..e964e345 100644 --- a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs +++ b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs @@ -151,14 +151,19 @@ public static partial class FreeSqlGlobalExtensions return Expression.New(ctor, ctor.GetParameters().Select(a => Expression.Constant(a.ParameterType.CreateInstanceGetDefaultValue(), a.ParameterType))); } - static ConcurrentDictionary _dicInternalGetTypeConstructor0OrFirst = new ConcurrentDictionary(); + static ConcurrentDictionary> _dicInternalGetTypeConstructor0OrFirst = new ConcurrentDictionary>(); internal static ConstructorInfo InternalGetTypeConstructor0OrFirst(this Type that, bool isThrow = true) { var ret = _dicInternalGetTypeConstructor0OrFirst.GetOrAdd(that, tp => - tp.GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[0], null) ?? - tp.GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).OrderBy(a => a.IsPublic ? 0 : 1).FirstOrDefault()); - if (ret == null && isThrow) throw new ArgumentException(CoreStrings.Type_Cannot_Access_Constructor(that.FullName)); - return ret; + new Lazy(() => + { + return tp.GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[0], null) ?? + tp.GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) + .OrderBy(a => a.IsPublic ? 0 : 1) + .FirstOrDefault(); + })); + if (ret.Value == null && isThrow) throw new ArgumentException(CoreStrings.Type_Cannot_Access_Constructor(that.FullName)); + return ret.Value; } static ConcurrentDictionary> _dicGetPropertiesDictIgnoreCase = new ConcurrentDictionary>(); @@ -466,7 +471,7 @@ public static partial class FreeSqlGlobalExtensions if (keyval.Length != 2) throw new ArgumentException(CoreStrings.ParameterError_NotValid_UseCommas(nameof(where))); if (reftb.ColumnsByCs.TryGetValue(keyval[0], out var keycol) == false) - throw new ArgumentException(CoreStrings.ParameterError_NotValid_PropertyName(nameof(where),keyval[0], reftb.Type.DisplayCsharp())); + throw new ArgumentException(CoreStrings.ParameterError_NotValid_PropertyName(nameof(where), keyval[0], reftb.Type.DisplayCsharp())); if (parTb.ColumnsByCs.TryGetValue(keyval[1], out var valcol) == false) throw new ArgumentException(CoreStrings.ParameterError_NotValid_PropertyName(nameof(where), keyval[1], parTb.Type.DisplayCsharp())); @@ -1210,5 +1215,5 @@ SELECT "); #endregion - + }