diff --git a/Src/Asp.Net/SqlServerTest/Demo/DemoM_UnitOfWork.cs b/Src/Asp.Net/SqlServerTest/Demo/DemoM_UnitOfWork.cs index 2c8006cc1..77c46746b 100644 --- a/Src/Asp.Net/SqlServerTest/Demo/DemoM_UnitOfWork.cs +++ b/Src/Asp.Net/SqlServerTest/Demo/DemoM_UnitOfWork.cs @@ -14,58 +14,54 @@ namespace OrmTest Console.WriteLine(""); Console.WriteLine("#### DemoM_UnitOfWork ####"); - - DbContext.Db.UseTran(() => + var db=NewUnitTest.Db; + using (var uow = db.CreateContext()) + { + var o = uow.GetRepository(); + var o2 = uow.GetMyRepository>(); + var list = o.GetList();//默认仓储 + var list2 = o2.CommQuery();//自定义仓储 + var list3 = uow.Orders1.GetList();//MyDbContext中的默认仓储 + var list4 = uow.Orders2.GetList();//MyDbContext中的自定义仓储 + uow.Commit(); + } + var d = DateTime.Now; + for (int i = 0; i < 100000; i++) { - - var id = DbContext.CustomDal.InsertReturnIdentity(new Custom() { Id = 1, Name = "guid" }); - var id2 = DbContext.OrderDal.InsertReturnIdentity(new Order() { Name = "guid2", Price = 0, CreateTime = DateTime.Now, CustomId = 1 }); - throw new Exception(""); - }, - e => - { - //throw e; - }); - Console.WriteLine(""); + db.CreateContext(); + } + Console.WriteLine("CreateContext 100000:" + (DateTime.Now-d).TotalMilliseconds+"ms"); Console.WriteLine("#### Saveable End ####"); } - public class DbContext + /// + /// 自定义DbContext + /// + public class MyDbContext : SugarUnitOfWork { - public static SqlSugarScope Db = new SqlSugarScope(new ConnectionConfig() + /// + /// 原生仓储 + /// + public SimpleClient Orders1 { get; set; } + /// + ///自定义仓储 + /// + public DbSet Orders2 { get; set; } + } + /// + /// 自定义仓储 + /// + /// + public class DbSet : SimpleClient where T : class, new() + { + /// + /// 仓储自定义方法 + /// + /// + public List CommQuery() { - DbType = SqlSugar.DbType.SqlServer, - ConnectionString = Config.ConnectionString, - IsAutoCloseConnection = true - }, db => { - //单例参数配置,所有上下文生效 - db.Aop.OnLogExecuting = (s, p) => - { - Console.WriteLine(s); - }; - }); - - public static DbSet OrderDal => new DbSet(); - public static DbSet CustomDal => new DbSet(); - - - public class DbSet : SimpleClient where T : class, new() - { - public DbSet(ISqlSugarClient context = null) : base(context)//需要有构造参数 - { - base.Context = DbContext.Db; - } - - /// - /// 扩展方法,自带方法不能满足的时候可以添加新方法 - /// - /// - public List CommQuery(string json) - { - //base.Context.Queryable().ToList();可以拿到SqlSugarClient 做复杂操作 - return null; - } - + return base.Context.Queryable().ToList(); } + } } diff --git a/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs index be940c16c..c363163de 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarProvider.cs @@ -956,6 +956,11 @@ namespace SqlSugar #endregion #region SimpleClient + public T CreateContext(bool isTran) where T : SugarUnitOfWork, new() + { + Check.ExceptionEasy(" var childDb=Db.GetConnection(configId); use Db.CreateContext ", " 例如 var childDb=Db.GetConnection(configId);其中Db才能使用CreateContext,childDb不能使用"); + return null; + } public SugarUnitOfWork CreateContext(bool isTran = true) { Check.ExceptionEasy(" var childDb=Db.GetConnection(configId); use Db.CreateContext ", " 例如 var childDb=Db.GetConnection(configId);其中Db才能使用CreateContext,childDb不能使用"); diff --git a/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarScopeProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarScopeProvider.cs index edc7e0f33..827bc3698 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarScopeProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/SugarProvider/SqlSugarScopeProvider.cs @@ -188,6 +188,11 @@ namespace SqlSugar { return ScopedContext.GetDate(); } + public T CreateContext(bool isTran) where T : SugarUnitOfWork, new() + { + Check.ExceptionEasy(" var childDb=Db.GetConnection(configId); use Db.CreateContext ", " 例如 var childDb=Db.GetConnection(configId);其中Db才能使用CreateContext,childDb不能使用"); + return null; + } public SugarUnitOfWork CreateContext(bool isTran = true) { Check.ExceptionEasy(" var childDb=Db.GetConnection(configId); use Db.CreateContext ", " 例如 var childDb=Db.GetConnection(configId);其中Db才能使用CreateContext,childDb不能使用"); diff --git a/Src/Asp.Net/SqlSugar/Interface/ISqlSugarClient.cs b/Src/Asp.Net/SqlSugar/Interface/ISqlSugarClient.cs index 3abdfd7e2..8d1bdad0b 100644 --- a/Src/Asp.Net/SqlSugar/Interface/ISqlSugarClient.cs +++ b/Src/Asp.Net/SqlSugar/Interface/ISqlSugarClient.cs @@ -44,6 +44,7 @@ namespace SqlSugar #endregion #region Other methods + T CreateContext(bool isTran=true) where T : SugarUnitOfWork, new(); SugarUnitOfWork CreateContext(bool isTran = true); SplitTableContext SplitHelper() where T : class, new(); SplitTableContextResult SplitHelper(T data) where T : class, new(); diff --git a/Src/Asp.Net/SqlSugar/SqlSugarClient.cs b/Src/Asp.Net/SqlSugar/SqlSugarClient.cs index f872f8f07..9e6051dd5 100644 --- a/Src/Asp.Net/SqlSugar/SqlSugarClient.cs +++ b/Src/Asp.Net/SqlSugar/SqlSugarClient.cs @@ -67,17 +67,45 @@ namespace SqlSugar #endregion #region SimpleClient + + public T CreateContext(bool isTran=true) where T : SugarUnitOfWork, new() + { + T result = new T(); + _CreateContext(isTran, result); + var type = typeof(T); + var ps = type.GetProperties(); + var cacheKey = "SugarUnitOfWork" + typeof(T).FullName + typeof(T).GetHashCode(); + var properies = new ReflectionInoCacheService().GetOrCreate(cacheKey, + () => + ps.Where(it => + + (it.PropertyType.BaseType != null && it.PropertyType.BaseType.Name.StartsWith("SimpleClient`")) + || + it.PropertyType.Name.StartsWith("SimpleClient`") + + )); + foreach (var item in properies) + { + var value = Activator.CreateInstance(item.PropertyType); + value.GetType().GetProperty("Context").SetValue(value, this); + item.SetValue(result, value); + } + return result; + } public SugarUnitOfWork CreateContext(bool isTran = true) { SugarUnitOfWork sugarUnitOf = new SugarUnitOfWork(); + return _CreateContext(isTran, sugarUnitOf); + } + + private SugarUnitOfWork _CreateContext(bool isTran, SugarUnitOfWork sugarUnitOf) + { sugarUnitOf.Db = this; sugarUnitOf.Tenant = this; sugarUnitOf.IsTran = true; this.Open(); if (isTran) - { this.BeginTran(); - } return sugarUnitOf; } public SimpleClient GetSimpleClient() where T : class, new() diff --git a/Src/Asp.Net/SqlSugar/SqlSugarScope.cs b/Src/Asp.Net/SqlSugar/SqlSugarScope.cs index 028262a64..352e4cef8 100644 --- a/Src/Asp.Net/SqlSugar/SqlSugarScope.cs +++ b/Src/Asp.Net/SqlSugar/SqlSugarScope.cs @@ -175,6 +175,10 @@ namespace SqlSugar return ScopedContext.GetDate(); } + public T CreateContext(bool isTran = true) where T : SugarUnitOfWork, new() + { + return ScopedContext.CreateContext(isTran); + } public SugarUnitOfWork CreateContext(bool isTran = true) { return ScopedContext.CreateContext(isTran);