林豪 左 3 years ago
parent
commit
00dc014ff1
4 changed files with 145 additions and 169 deletions
  1. 128 144
      DBHelper/DB.cs
  2. 1 2
      DBHelper/DbLog.cs
  3. 14 18
      DBHelper/EFLoggerProvider.cs
  4. 2 5
      DBHelper/EntityValidationException.cs

+ 128 - 144
DBHelper/DB.cs

@@ -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)

+ 1 - 2
DBHelper/DbLog.cs

@@ -19,8 +19,7 @@ namespace DBHelper
 
         static DbLog()
         {
-            if (Log == null)
-                Log = new DbLog();
+            Log = new DbLog();
         }
 
         public DbLog()

+ 14 - 18
DBHelper/EFLoggerProvider.cs

@@ -3,38 +3,34 @@ using System;
 
 namespace DBHelper
 {
-    public class EFLoggerProvider : ILoggerProvider
+    public class EfLoggerProvider : ILoggerProvider
     {
-        public ILogger CreateLogger(string categoryName) => new EFLogger(categoryName);
+        public ILogger CreateLogger(string categoryName) => new EfLogger(categoryName);
 
         public void Dispose()
         { }
     }
 
-    public class EFLogger : ILogger
+    public class EfLogger : ILogger
     {
-        private readonly string categoryName;
+        private readonly string _categoryName;
 
-        public EFLogger(string categoryName) => this.categoryName = categoryName;
+        public EfLogger(string categoryName) => this._categoryName = categoryName;
 
         public bool IsEnabled(LogLevel logLevel) => true;
 
         public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
         {
             //ef core执行数据库查询时的categoryName为Microsoft.EntityFrameworkCore.Database.Command,日志级别为Information
-            if (categoryName == "Microsoft.EntityFrameworkCore.Database.Command"
-                    && logLevel == LogLevel.Information)
-            {
-                var logContent = formatter(state, exception);
-
-                if (logContent.Contains("SRM5") || logContent.Contains("STATION5") || logContent.Contains("RGV5") || logContent.Contains("BCR8")) return;
-                DbLog.DBEX(logContent);
-                //TODO: 拿到日志内容想怎么玩就怎么玩吧
-                //Console.WriteLine();
-                //Console.ForegroundColor = ConsoleColor.Green;
-                //Console.WriteLine(logContent);
-                //Console.ResetColor();
-            }
+            if (_categoryName != "Microsoft.EntityFrameworkCore.Database.Command" ||
+                logLevel != LogLevel.Information) return;
+            var logContent = formatter(state, exception);
+
+            //TODO: 拿到日志内容想怎么玩就怎么玩吧
+            //Console.WriteLine();
+            //Console.ForegroundColor = ConsoleColor.Green;
+            //Console.WriteLine(logContent);
+            //Console.ResetColor();
         }
 
         public IDisposable BeginScope<TState>(TState state) => null;

+ 2 - 5
DBHelper/EntityValidationException.cs

@@ -1,14 +1,11 @@
 using System;
 using System.Collections.Generic;
 using System.ComponentModel.DataAnnotations;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
 
 namespace DBHelper
 {
     public class EntityValidationException : Exception
     {
-        public List<ValidationResult> EntityValidationErrors = new List<ValidationResult>(); 
+        public List<ValidationResult> EntityValidationErrors = new();
     }
-}
+}