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