| 
					
				 | 
			
			
				@@ -6,35 +6,35 @@ using System.Transactions; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 namespace DBHelper 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    public class DB2 : IDisposable 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public class Db2 : IDisposable 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         public static Type DefaultDbContextType { get; private set; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        private static object lockObj = new object(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private static readonly object LockObj = new object(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        public static T Do<T>(Func<DB2, T> func) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public static T Do<T>(Func<Db2, T> func) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            lock (lockObj) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                using (var db = new DB2()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            lock (LockObj) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                using var db = new Db2(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        var res = func(db); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        db.Commit(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        return res; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    catch (EntityValidationException ex) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        var qty = ex.EntityValidationErrors.Count(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        var info = ex.EntityValidationErrors.First(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        var msg = "有" + qty + "条数据验证失败,首条错误信息:\n" + string.Join("\n", info.MemberNames) + "\n" + (info.ErrorMessage ?? ""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        Console.WriteLine(msg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        throw new Exception(msg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    var res = func(db); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    db.Commit(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    return res; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                catch (EntityValidationException ex) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    var qty = ex.EntityValidationErrors.Count(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    var info = ex.EntityValidationErrors.First(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    var msg = "有" + qty + "条数据验证失败,首条错误信息:\n" + string.Join("\n", info.MemberNames) + "\n" + (info.ErrorMessage ?? ""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Console.WriteLine(msg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    throw new Exception(msg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        public static void Do(Action<DB2> act) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public static void Do(Action<Db2> act) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             Do(db => 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -76,7 +76,7 @@ namespace DBHelper 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 return Contexts[type]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                DbContext ctx = Activator.CreateInstance(type) as DbContext; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var ctx = Activator.CreateInstance(type) as DbContext; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 ctx.Database.BeginTransaction(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 Contexts.Add(type, ctx); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 return ctx; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -111,10 +111,10 @@ namespace DBHelper 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     if (exception == null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        ctx.Database.CurrentTransaction.Commit(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        ctx.Database.CurrentTransaction!.Commit(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        ctx.Database.CurrentTransaction.Rollback(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        ctx.Database.CurrentTransaction!.Rollback(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         throw exception; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -136,37 +136,35 @@ namespace DBHelper 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public class DB : IDisposable 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        private List<DbContext> Contexts = new List<DbContext>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private readonly List<DbContext> _contexts = new List<DbContext>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         public static Type DefaultDbContextType { get; private set; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         public static T Do<T>(Func<DB, T> func) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            TransactionOptions transactionOptions = new TransactionOptions(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            transactionOptions.IsolationLevel = IsolationLevel.ReadCommitted; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            transactionOptions.Timeout = new TimeSpan(0, 2, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            using (var trans = new TransactionScope(TransactionScopeOption.RequiresNew, transactionOptions)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var transactionOptions = new TransactionOptions 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                using (var db = new DB()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        var res = func(db); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        trans.Complete(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        return res; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    catch (EntityValidationException ex) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        var qty = ex.EntityValidationErrors.Count(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        var info = ex.EntityValidationErrors.First(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        var msg = "有" + qty + "条数据验证失败,首条错误信息:\n" + string.Join("\n", info.MemberNames) + "\n" + (info.ErrorMessage ?? ""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        Console.WriteLine(msg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        throw new Exception(msg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    finally 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        db.Dispose(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                IsolationLevel = IsolationLevel.ReadCommitted, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Timeout = new TimeSpan(0, 2, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            using var trans = new TransactionScope(TransactionScopeOption.RequiresNew, transactionOptions); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            using var db = new DB(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var res = func(db); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                trans.Complete(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return res; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            catch (EntityValidationException ex) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var qty = ex.EntityValidationErrors.Count(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var info = ex.EntityValidationErrors.First(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var msg = "有" + qty + "条数据验证失败,首条错误信息:\n" + string.Join("\n", info.MemberNames) + "\n" + (info.ErrorMessage ?? ""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Console.WriteLine(msg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                throw new Exception(msg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            finally 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                db.Dispose(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -201,12 +199,10 @@ namespace DBHelper 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         public DbContext Context(Type type) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            var ctx = Contexts.Where(v => v.GetType() == type).FirstOrDefault(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (ctx == null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                ctx = Activator.CreateInstance(type) as DbContext; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                Contexts.Add(ctx); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var ctx = _contexts.FirstOrDefault(v => v.GetType() == type); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (ctx != null) return ctx; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ctx = Activator.CreateInstance(type) as DbContext; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            _contexts.Add(ctx); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             return ctx; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -217,11 +213,11 @@ namespace DBHelper 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         public void Dispose() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            foreach (var ctx in Contexts) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            foreach (var ctx in _contexts) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 ctx.Dispose(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            Contexts.Clear(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            _contexts.Clear(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -245,33 +241,31 @@ namespace DBHelper 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         /// <returns></returns> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         public static T Do<T>(Func<TContext, T> func) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            using (var ctx = Activator.CreateInstance<TContext>()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            using var ctx = Activator.CreateInstance<TContext>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var trans = ctx.Database.BeginTransaction(System.Data.IsolationLevel.Serializable); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                var trans = ctx.Database.BeginTransaction(System.Data.IsolationLevel.Serializable); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        var result = func(ctx); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        ctx.SaveChanges(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        trans.Commit(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    catch (Exception ex) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        trans.Rollback(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        throw ex.GetBaseException(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    var result = func(ctx); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    ctx.SaveChanges(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    trans.Commit(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                catch (EntityValidationException ex) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                catch (Exception ex) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    var qty = ex.EntityValidationErrors.Count(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    var info = ex.EntityValidationErrors.First(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    var msg = "有" + qty + "条数据验证失败,首条错误信息:\n" + string.Join("\n", info.MemberNames) + "\n" + (info.ErrorMessage ?? ""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    Console.WriteLine(msg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    throw new Exception(msg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    trans.Rollback(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    throw ex.GetBaseException(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            catch (EntityValidationException ex) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var qty = ex.EntityValidationErrors.Count(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var info = ex.EntityValidationErrors.First(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var msg = "有" + qty + "条数据验证失败,首条错误信息:\n" + string.Join("\n", info.MemberNames) + "\n" + (info.ErrorMessage ?? ""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Console.WriteLine(msg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                throw new Exception(msg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         /// <summary> 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -292,40 +286,36 @@ namespace DBHelper 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         public static T Do<T>(Func<TContext1, TContext2, T> func) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            using (var ctx = Activator.CreateInstance<TContext1>()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            using var ctx = Activator.CreateInstance<TContext1>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            using var ctx2 = Activator.CreateInstance<TContext2>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var trans = ctx.Database.BeginTransaction(System.Data.IsolationLevel.Serializable); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var trans2 = ctx2.Database.BeginTransaction(System.Data.IsolationLevel.Serializable); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                using (var ctx2 = Activator.CreateInstance<TContext2>()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    var trans = ctx.Database.BeginTransaction(System.Data.IsolationLevel.Serializable); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    var trans2 = ctx2.Database.BeginTransaction(System.Data.IsolationLevel.Serializable); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            var result = func(ctx, ctx2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            ctx.SaveChanges(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            ctx2.SaveChanges(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            trans.Commit(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            trans2.Commit(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        catch (Exception ex) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            trans.Rollback(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            trans2.Rollback(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            throw ex.GetBaseException(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    catch (EntityValidationException ex) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        var qty = ex.EntityValidationErrors.Count(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        var info = ex.EntityValidationErrors.First(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        var msg = "有" + qty + "条数据验证失败,首条错误信息:\n" + string.Join("\n", info.MemberNames) + "\n" + (info.ErrorMessage ?? ""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        Console.WriteLine(msg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        throw new Exception(msg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    var result = func(ctx, ctx2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    ctx.SaveChanges(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    ctx2.SaveChanges(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    trans.Commit(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    trans2.Commit(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                catch (Exception ex) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    trans.Rollback(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    trans2.Rollback(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    throw ex.GetBaseException(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            catch (EntityValidationException ex) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var qty = ex.EntityValidationErrors.Count(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var info = ex.EntityValidationErrors.First(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var msg = "有" + qty + "条数据验证失败,首条错误信息:\n" + string.Join("\n", info.MemberNames) + "\n" + (info.ErrorMessage ?? ""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Console.WriteLine(msg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                throw new Exception(msg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         public static void Do(Action<TContext1, TContext2> act) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -342,47 +332,41 @@ namespace DBHelper 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         public static T Do<T>(Func<TContext1, TContext2, TContext3, T> func) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            using (var ctx = Activator.CreateInstance<TContext1>()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            using var ctx = Activator.CreateInstance<TContext1>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            using var ctx2 = Activator.CreateInstance<TContext2>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            using var ctx3 = Activator.CreateInstance<TContext3>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var trans = ctx.Database.BeginTransaction(System.Data.IsolationLevel.Serializable); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var trans2 = ctx2.Database.BeginTransaction(System.Data.IsolationLevel.Serializable); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var trans3 = ctx3.Database.BeginTransaction(System.Data.IsolationLevel.Serializable); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                using (var ctx2 = Activator.CreateInstance<TContext2>()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    using (var ctx3 = Activator.CreateInstance<TContext3>()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        var trans = ctx.Database.BeginTransaction(System.Data.IsolationLevel.Serializable); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        var trans2 = ctx2.Database.BeginTransaction(System.Data.IsolationLevel.Serializable); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        var trans3 = ctx3.Database.BeginTransaction(System.Data.IsolationLevel.Serializable); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                var result = func(ctx, ctx2, ctx3); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                ctx.SaveChanges(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                ctx2.SaveChanges(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                ctx3.SaveChanges(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                trans.Commit(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                trans2.Commit(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                trans3.Commit(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            catch (Exception ex) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                trans.Rollback(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                trans2.Rollback(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                trans3.Rollback(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                throw ex.GetBaseException(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        catch (EntityValidationException ex) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            var qty = ex.EntityValidationErrors.Count(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            var info = ex.EntityValidationErrors.First(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            var msg = "有" + qty + "条数据验证失败,首条错误信息:\n" + string.Join("\n", info.MemberNames) + "\n" + (info.ErrorMessage ?? ""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            Console.WriteLine(msg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            throw new Exception(msg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    var result = func(ctx, ctx2, ctx3); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    ctx.SaveChanges(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    ctx2.SaveChanges(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    ctx3.SaveChanges(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    trans.Commit(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    trans2.Commit(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    trans3.Commit(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                catch (Exception ex) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    trans.Rollback(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    trans2.Rollback(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    trans3.Rollback(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    throw ex.GetBaseException(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            catch (EntityValidationException ex) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var qty = ex.EntityValidationErrors.Count(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var info = ex.EntityValidationErrors.First(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var msg = "有" + qty + "条数据验证失败,首条错误信息:\n" + string.Join("\n", info.MemberNames) + "\n" + (info.ErrorMessage ?? ""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Console.WriteLine(msg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                throw new Exception(msg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         public static void Do(Action<TContext1, TContext2, TContext3> act) 
			 |