From fe5a8fc3552b45e5ead3c12b093f07675de77857 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Sun, 13 Nov 2022 23:07:49 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20=20DbContext=20DbSet?= =?UTF-8?q?=20=E5=B1=9E=E6=80=A7=E5=88=9D=E5=A7=8B=E5=B9=B6=E5=8F=91?= =?UTF-8?q?=E6=97=B6=E6=9C=AA=E8=A7=A6=E5=8F=91=20OnModelCreating=EF=BC=9B?= =?UTF-8?q?#1333?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.DbContext/DbContext/DbContext.cs | 27 ++++++++++++++++-------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/FreeSql.DbContext/DbContext/DbContext.cs b/FreeSql.DbContext/DbContext/DbContext.cs index d76dc6fc..03323796 100644 --- a/FreeSql.DbContext/DbContext/DbContext.cs +++ b/FreeSql.DbContext/DbContext/DbContext.cs @@ -83,20 +83,29 @@ namespace FreeSql #region Set static ConcurrentDictionary> _dicGetDbSetProps = new ConcurrentDictionary>(); + static object _lockOnModelCreating = new object(); internal void InitPropSets() { var thisType = this.GetType(); - var dicval = _dicGetDbSetProps.GetOrAdd(thisType, tp => - NativeTuple.Create( - tp.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public) - .Where(a => a.PropertyType.IsGenericType && - a.PropertyType == typeof(DbSet<>).MakeGenericType(a.PropertyType.GetGenericArguments()[0])).ToArray(), - false)); - if (dicval.Item2 == false) + var isOnModelCreating = false; + if (_dicGetDbSetProps.TryGetValue(thisType, out var dicval) == false) { - if (_dicGetDbSetProps.TryUpdate(thisType, NativeTuple.Create(dicval.Item1, true), dicval)) - OnModelCreating(OrmOriginal.CodeFirst); + lock (_lockOnModelCreating) + { + if (_dicGetDbSetProps.TryGetValue(thisType, out dicval) == false) + { + dicval = NativeTuple.Create( + thisType.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public) + .Where(a => a.PropertyType.IsGenericType && + a.PropertyType == typeof(DbSet<>).MakeGenericType(a.PropertyType.GetGenericArguments()[0])).ToArray(), + false); + _dicGetDbSetProps.TryAdd(thisType, dicval); + isOnModelCreating = true; + } + } } + if (isOnModelCreating) + OnModelCreating(OrmOriginal.CodeFirst); foreach (var prop in dicval.Item1) {