Exemplo n.º 1
0
        public MessageModel <string> GetFrameFiles()
        {
            var data = new MessageModel <string>()
            {
                success = true, msg = ""
            };

            if (Env.IsDevelopment())
            {
                BaseDBConfig.MutiConnectionString.Item1.ToList().ForEach(m =>
                {
                    _sqlSugarClient.ChangeDatabase(m.ConnId.ToLower());
                    data.response += $"库{m.ConnId}-Model层生成:{FrameSeed.CreateModels(_sqlSugarClient, m.ConnId)} || ";
                    data.response += $"库{m.ConnId}-IRepositorys层生成:{FrameSeed.CreateIRepositorys(_sqlSugarClient, m.ConnId)} || ";
                    data.response += $"库{m.ConnId}-IServices层生成:{FrameSeed.CreateIServices(_sqlSugarClient, m.ConnId)} || ";
                    data.response += $"库{m.ConnId}-Repository层生成:{FrameSeed.CreateRepository(_sqlSugarClient, m.ConnId)} || ";
                    data.response += $"库{m.ConnId}-Services层生成:{FrameSeed.CreateServices(_sqlSugarClient, m.ConnId)} || ";
                });

                // 切回主库
                _sqlSugarClient.ChangeDatabase(MainDb.CurrentDbConnId.ToLower());
            }
            else
            {
                data.success = false;
                data.msg     = "当前不处于开发模式,代码生成不可用!";
            }

            return(data);
        }
Exemplo n.º 2
0
        /// <summary>
        ///Async tran demo
        /// </summary>
        /// <param name="db"></param>
        /// <returns></returns>
        private static async Task <DbResult <bool> > AsyncTranDemo(SqlSugarClient db)
        {
            //need await all
            var result2 = await db.UseTranAsync(async() =>
            {
                //need await all

                db.ChangeDatabase("1");//use db1
                await db.Deleteable <Order>().ExecuteCommandAsync();
                Console.WriteLine("---Delete all " + db.CurrentConnectionConfig.DbType);
                Console.WriteLine(db.Queryable <Order>().Count());

                db.ChangeDatabase("2");//use db2
                await db.Deleteable <Order>().ExecuteCommandAsync();
                Console.WriteLine("---Delete all " + db.CurrentConnectionConfig.DbType);
                Console.WriteLine(db.Queryable <Order>().Count());
                throw new Exception("");
            });

            Console.WriteLine("---Roll back");
            db.ChangeDatabase("1");//use sqlserver
            Console.WriteLine(db.CurrentConnectionConfig.DbType);
            Console.WriteLine(db.Queryable <Order>().Count());

            db.ChangeDatabase("2");//use mysql
            Console.WriteLine(db.CurrentConnectionConfig.DbType);
            Console.WriteLine(db.Queryable <Order>().Count());
            return(result2);
        }
Exemplo n.º 3
0
        public MessageModel <string> GetFrameFiles()
        {
            var data = new MessageModel <string>()
            {
                success = true, msg = ""
            };

            data.response += @"file path is:C:\my-file\}";
            var isMuti = Appsettings.app(new string[] { "MutiDBEnabled" }).ObjToBool();

            if (Env.IsDevelopment())
            {
                data.response += $"Controller层生成:{FrameSeed.CreateControllers(_sqlSugarClient)} || ";

                BaseDBConfig.MutiConnectionString.Item1.ToList().ForEach(m =>
                {
                    _sqlSugarClient.ChangeDatabase(m.ConnId.ToLower());
                    data.response += $"库{m.ConnId}-Model层生成:{FrameSeed.CreateModels(_sqlSugarClient, m.ConnId, isMuti)} || ";
                    data.response += $"库{m.ConnId}-IRepositorys层生成:{FrameSeed.CreateIRepositorys(_sqlSugarClient, m.ConnId, isMuti)} || ";
                    data.response += $"库{m.ConnId}-IServices层生成:{FrameSeed.CreateIServices(_sqlSugarClient, m.ConnId, isMuti)} || ";
                    data.response += $"库{m.ConnId}-Repository层生成:{FrameSeed.CreateRepository(_sqlSugarClient, m.ConnId, isMuti)} || ";
                    data.response += $"库{m.ConnId}-Services层生成:{FrameSeed.CreateServices(_sqlSugarClient, m.ConnId, isMuti)} || ";
                });

                // 切回主库
                _sqlSugarClient.ChangeDatabase(MainDb.CurrentDbConnId.ToLower());
            }
            else
            {
                data.success = false;
                data.msg     = "当前不处于开发模式,代码生成不可用!";
            }

            return(data);
        }
Exemplo n.º 4
0
        /// <summary>
        /// 功能描述:根据数据库表生产 Services 层
        /// 作  者:NQI_LIMS
        /// </summary>
        /// <param name="sqlSugarClient"></param>
        /// <param name="ConnId">数据库链接ID</param>
        /// <param name="strPath">实体类存放路径</param>
        /// <param name="strNameSpace">命名空间</param>
        /// <param name="lstTableNames">生产指定的表</param>
        /// <param name="strInterface">实现接口</param>
        /// <param name="isMuti"></param>
        private static void Create_Services_ClassFileByDBTalbe(
            SqlSugarClient sqlSugarClient,
            string ConnId,
            string strPath,
            string strNameSpace,
            string[] lstTableNames,
            string strInterface,
            bool isMuti = false)
        {
            //20200706 当表操作的时候,切换数据库好像不起作用,所以添加这个 ConnId
            if (!string.IsNullOrEmpty(ConnId))
            {
                sqlSugarClient.ChangeDatabase(ConnId.ToLower());
            }
            //多库文件分离
            if (isMuti)
            {
                strPath = strPath + @"\" + ConnId;
                // strNameSpace = strNameSpace + "." + ConnId;
            }

            var IDbFirst = sqlSugarClient.DbFirst;

            if (lstTableNames != null && lstTableNames.Length > 0)
            {
                IDbFirst = IDbFirst.Where(lstTableNames);
            }
            var ls = IDbFirst.IsCreateDefaultValue().IsCreateAttribute()

                     .SettingClassTemplate(p => p =
                                               @"using NQI_LIMS.IRepository;
using NQI_LIMS.IServices;
using NQI_LIMS.Model.Models;
//using NQI_LIMS.IRepository" + (isMuti ? "." + ConnId + "" : "") + @";
//using NQI_LIMS.IServices" + (isMuti ? "." + ConnId + "" : "") + @";
//using NQI_LIMS.Model.Models" + (isMuti ? "." + ConnId + "" : "") + @";
using NQI_LIMS.Services.BASE;

namespace " + strNameSpace + @"
{
    public partial class {ClassName}Services : BaseServices<{ClassName}>, I{ClassName}Services" + (string.IsNullOrEmpty(strInterface) ? "" : (" , " + strInterface)) + @"
    {
        private readonly I{ClassName}Repository _dal;
        public {ClassName}Services(I{ClassName}Repository dal)
        {
            this._dal = dal;
            base.BaseDal = dal;
        }
    }
}")
                     .ToClassStringList(strNameSpace);

            CreateFilesByClassStringList(ls, strPath, "{0}Services");

            // 20200706 切回主库
            if (!string.IsNullOrEmpty(ConnId))
            {
                sqlSugarClient.ChangeDatabase(Common.DB.MainDb.CurrentDbConnId.ToLower());
            }
        }
Exemplo n.º 5
0
        /// <summary>
        /// 功能描述:根据数据库表生产IRepository层
        /// 作  者:NQI_LIMS
        /// </summary>
        /// <param name="sqlSugarClient"></param>
        /// <param name="ConnId">数据库链接ID</param>
        /// <param name="strPath">实体类存放路径</param>
        /// <param name="strNameSpace">命名空间</param>
        /// <param name="lstTableNames">生产指定的表</param>
        /// <param name="strInterface">实现接口</param>
        /// <param name="isMuti"></param>
        private static void Create_IRepository_ClassFileByDBTalbe(
            SqlSugarClient sqlSugarClient,
            string ConnId,
            string strPath,
            string strNameSpace,
            string[] lstTableNames,
            string strInterface,
            bool isMuti = false)
        {
            //20200706 当表操作的时候,切换数据库好像不起作用,所以添加这个 ConnId
            if (!string.IsNullOrEmpty(ConnId))
            {
                sqlSugarClient.ChangeDatabase(ConnId.ToLower());
            }
            //多库文件分离
            if (isMuti)
            {
                strPath = strPath + @"\" + ConnId;
                // strNameSpace = strNameSpace + "." + ConnId;
            }

            var IDbFirst = sqlSugarClient.DbFirst;

            if (lstTableNames != null && lstTableNames.Length > 0)
            {
                IDbFirst = IDbFirst.Where(lstTableNames);
            }
            var ls = IDbFirst.IsCreateDefaultValue().IsCreateAttribute()

                     .SettingClassTemplate(p => p =
                                               @"using NQI_LIMS.IRepository.Base;
//using NQI_LIMS.Model.Models" + (isMuti ? "." + ConnId + "" : "") + @";
using NQI_LIMS.Model.Models;
namespace " + strNameSpace + @"
{
	/// <summary>
	/// I{ClassName}Repository
	/// </summary>	
    public interface I{ClassName}Repository : IBaseRepository<{ClassName}>" + (string.IsNullOrEmpty(strInterface) ? "" : (" , " + strInterface)) + @"
    {
    }
}")

                     .ToClassStringList(strNameSpace);

            CreateFilesByClassStringList(ls, strPath, "I{0}Repository");

            // 20200706 切回主库
            if (!string.IsNullOrEmpty(ConnId))
            {
                sqlSugarClient.ChangeDatabase(Common.DB.MainDb.CurrentDbConnId.ToLower());
            }
        }
Exemplo n.º 6
0
 public Repository(ISqlSugarClient context = null) : base(context)//注意这里要有默认值等于null
 {
     if (context == null)
     {
         var db = new SqlSugarClient(new List <ConnectionConfig> {
             new ConnectionConfig()
             {
                 ConfigId = "1",
                 DbType   = SqlSugar.DbType.SqlServer,
                 IsAutoCloseConnection = true,
                 ConnectionString      = Config.ConnectionString
             },
             new ConnectionConfig()
             {
                 ConfigId = "2",
                 DbType   = SqlSugar.DbType.SqlServer,
                 IsAutoCloseConnection = true,
                 ConnectionString      = Config.ConnectionString2
             }
         });
         base.Context = db;
         var configId = typeof(T).GetCustomAttribute <TenantAttribute>().configId;
         db.ChangeDatabase(configId);
     }
 }
Exemplo n.º 7
0
 protected ISqlSugarClient _db <TEntity>() where TEntity : class, new ()
 {
     /* 如果要开启多库支持,
      * 1、在appsettings.json 中开启MutiDBEnabled节点为true,必填
      * 2、设置一个主连接的数据库ID,节点MainDB,对应的连接字符串的Enabled也必须true,必填
      */
     if (Appsettings.app(new string[] { "MutiDBEnabled" }).ObjToBool())
     {
         if (typeof(TEntity).GetTypeInfo().GetCustomAttributes(typeof(SugarTable), true).FirstOrDefault((x => x.GetType() == typeof(SugarTable))) is SugarTable sugarTable && !string.IsNullOrEmpty(sugarTable.TableDescription))
         {
             _dbBase.ChangeDatabase(sugarTable.TableDescription.ToLower());
         }
         else
         {
             _dbBase.ChangeDatabase(MainDb.CurrentDbConnId.ToLower());
         }
     }
Exemplo n.º 8
0
        private static void DistributedTransactionExample()
        {
            Console.WriteLine("");
            Console.WriteLine("#### Distributed TransactionExample Start ####");
            SqlSugarClient db = new SqlSugarClient(new List <ConnectionConfig>()
            {
                new ConnectionConfig()
                {
                    ConfigId = "1", DbType = DbType.PostgreSQL, ConnectionString = Config.ConnectionString, InitKeyType = InitKeyType.Attribute, IsAutoCloseConnection = true
                },
                new ConnectionConfig()
                {
                    ConfigId = "2", DbType = DbType.PostgreSQL, ConnectionString = Config.ConnectionString2, InitKeyType = InitKeyType.Attribute, IsAutoCloseConnection = true
                }
            });

            var db1 = db.Ado.Connection.Database;

            //use db1
            db.CodeFirst.SetStringDefaultLength(200).InitTables(typeof(Order), typeof(OrderItem));//
            db.Insertable(new Order()
            {
                Name = "order1", CreateTime = DateTime.Now
            }).ExecuteCommand();
            Console.WriteLine(db.CurrentConnectionConfig.DbType + ":" + db.Queryable <Order>().Count());

            //use db2
            db.ChangeDatabase("2");
            var db2 = db.Ado.Connection.Database;

            db.DbMaintenance.CreateDatabase();//Create Database2
            db.CodeFirst.SetStringDefaultLength(200).InitTables(typeof(Order), typeof(OrderItem));
            db.Insertable(new Order()
            {
                Name = "order1", CreateTime = DateTime.Now
            }).ExecuteCommand();
            Console.WriteLine(db.CurrentConnectionConfig.DbType + ":" + db.Queryable <Order>().Count());

            if (db2 == db1)
            {
                return;
            }
            // Example 1
            Console.WriteLine("Example 1");
            try
            {
                db.BeginTran();

                db.ChangeDatabase("1");//use db1
                db.Deleteable <Order>().ExecuteCommand();
                Console.WriteLine("---Delete all " + db.CurrentConnectionConfig.DbType);
                Console.WriteLine(db.Queryable <Order>().Count());

                db.ChangeDatabase("2");//use db2
                db.Deleteable <Order>().ExecuteCommand();
                Console.WriteLine("---Delete all " + db.CurrentConnectionConfig.DbType);
                Console.WriteLine(db.Queryable <Order>().Count());

                throw new Exception();
                db.CommitTran();
            }
            catch
            {
                db.RollbackTran();
                Console.WriteLine("---Roll back");
                db.ChangeDatabase("1");//use db1
                Console.WriteLine(db.CurrentConnectionConfig.DbType);
                Console.WriteLine(db.Queryable <Order>().Count());

                db.ChangeDatabase("2");//use db2
                Console.WriteLine(db.CurrentConnectionConfig.DbType);
                Console.WriteLine(db.Queryable <Order>().Count());
            }



            // Example 2
            Console.WriteLine("Example 2");

            var result = db.UseTran(() =>
            {
                db.ChangeDatabase("1");//use db1
                db.Deleteable <Order>().ExecuteCommand();
                Console.WriteLine("---Delete all " + db.CurrentConnectionConfig.DbType);
                Console.WriteLine(db.Queryable <Order>().Count());

                db.ChangeDatabase("2");//use db2
                db.Deleteable <Order>().ExecuteCommand();
                Console.WriteLine("---Delete all " + db.CurrentConnectionConfig.DbType);
                Console.WriteLine(db.Queryable <Order>().Count());
                throw new Exception("");
            });

            if (result.IsSuccess == false)
            {
                Console.WriteLine("---Roll back");
                db.ChangeDatabase("1");//use db1
                Console.WriteLine(db.CurrentConnectionConfig.DbType);
                Console.WriteLine(db.Queryable <Order>().Count());

                db.ChangeDatabase("2");//use db2
                Console.WriteLine(db.CurrentConnectionConfig.DbType);
                Console.WriteLine(db.Queryable <Order>().Count());
            }

            // Example 3
            Console.WriteLine("Example 3");

            var result2 = db.UseTranAsync(async() =>
            {
                db.ChangeDatabase("1");//use db1
                await db.Deleteable <Order>().ExecuteCommandAsync();
                Console.WriteLine("---Delete all " + db.CurrentConnectionConfig.DbType);
                Console.WriteLine(db.Queryable <Order>().Count());

                db.ChangeDatabase("2");//use db2
                await db.Deleteable <Order>().ExecuteCommandAsync();
                Console.WriteLine("---Delete all " + db.CurrentConnectionConfig.DbType);
                Console.WriteLine(db.Queryable <Order>().Count());
                throw new Exception("");
            });

            result2.Wait();
            if (result2.Result.IsSuccess == false)
            {
                Console.WriteLine("---Roll back");
                db.ChangeDatabase("1");//use sqlserver
                Console.WriteLine(db.CurrentConnectionConfig.DbType);
                Console.WriteLine(db.Queryable <Order>().Count());

                db.ChangeDatabase("2");//use mysql
                Console.WriteLine(db.CurrentConnectionConfig.DbType);
                Console.WriteLine(db.Queryable <Order>().Count());
            }

            Console.WriteLine("#### Distributed TransactionExample End ####");
        }
Exemplo n.º 9
0
 /// <summary>
 /// 对外的扩展操作
 /// </summary>
 public LogRepository(ISqlSugarClient sqlSugar)
 {
     _dbBase = sqlSugar as SqlSugarClient;
     _dbBase.ChangeDatabase(AppConfigurtaionService.Configuration["ConnectionStrings:DefaultLogDBConfigId"]);// 切换到日志库标记
 }
Exemplo n.º 10
0
        /// <summary>
        /// 功能描述:根据数据库表生产Model层
        /// 作  者:NQI_LIMS
        /// </summary>
        /// <param name="sqlSugarClient"></param>
        /// <param name="ConnId">数据库链接ID</param>
        /// <param name="strPath">实体类存放路径</param>
        /// <param name="strNameSpace">命名空间</param>
        /// <param name="lstTableNames">生产指定的表</param>
        /// <param name="strInterface">实现接口</param>
        /// <param name="isMuti"></param>
        /// <param name="blnSerializable">是否序列化</param>
        private static void Create_Model_ClassFileByDBTalbe(
            SqlSugarClient sqlSugarClient,
            string ConnId,
            string strPath,
            string strNameSpace,
            string[] lstTableNames,
            string strInterface,
            bool isMuti          = false,
            bool blnSerializable = false)
        {
            //20200706 当表操作的时候,切换数据库好像不起作用,所以添加这个 ConnId
            if (!string.IsNullOrEmpty(ConnId))
            {
                sqlSugarClient.ChangeDatabase(ConnId.ToLower());
            }
            //多库文件分离
            if (isMuti)
            {
                strPath = strPath + @"\Models\" + ConnId;
                //strNameSpace = strNameSpace + "." + ConnId;
            }

            var IDbFirst = sqlSugarClient.DbFirst;

            if (lstTableNames != null && lstTableNames.Length > 0)
            {
                IDbFirst = IDbFirst.Where(lstTableNames);
            }
            var ls = IDbFirst.IsCreateDefaultValue().IsCreateAttribute()

                     .SettingClassTemplate(p => p =
                                               @"{using}

namespace " + strNameSpace + @"
{
{ClassDescription}
    [SugarTable( ""{ClassName}"", """ + ConnId + @""")]" + (blnSerializable ? "\n    [Serializable]" : "") + @"
    public class {ClassName}" + (string.IsNullOrEmpty(strInterface) ? "" : (" : " + strInterface)) + @"
    {
        public {ClassName}()
        {
        }
        {PropertyName}
    }
}")
                     .SettingPropertyDescriptionTemplate(p => p = string.Empty)
                     .SettingPropertyTemplate(p => p            =
                                                  @"{SugarColumn}
           public {PropertyType} {PropertyName} { get; set; }")

                     //.SettingConstructorTemplate(p => p = "              this._{PropertyName} ={DefaultValue};")

                     .ToClassStringList(strNameSpace);

            CreateFilesByClassStringList(ls, strPath, "{0}");

            // 20200706 切回主库
            if (!string.IsNullOrEmpty(ConnId))
            {
                sqlSugarClient.ChangeDatabase(Common.DB.MainDb.CurrentDbConnId.ToLower());
            }
        }
Exemplo n.º 11
0
        /// <summary>
        /// 功能描述:根据数据库表生产Controller层
        /// 作  者:Blog.Core
        /// </summary>
        /// <param name="sqlSugarClient"></param>
        /// <param name="ConnId">数据库链接ID</param>
        /// <param name="strPath">实体类存放路径</param>
        /// <param name="strNameSpace">命名空间</param>
        /// <param name="lstTableNames">生产指定的表</param>
        /// <param name="strInterface">实现接口</param>
        /// <param name="isMuti"></param>
        /// <param name="blnSerializable">是否序列化</param>
        private static void Create_Controller_ClassFileByDBTalbe(
            SqlSugarClient sqlSugarClient,
            string ConnId,
            string strPath,
            string strNameSpace,
            string[] lstTableNames,
            string strInterface,
            bool isMuti          = false,
            bool blnSerializable = false)
        {
            //20200706 当表操作的时候,切换数据库好像不起作用,所以添加这个 ConnId
            if (!string.IsNullOrEmpty(ConnId))
            {
                sqlSugarClient.ChangeDatabase(ConnId.ToLower());
            }

            var IDbFirst = sqlSugarClient.DbFirst;

            if (lstTableNames != null && lstTableNames.Length > 0)
            {
                IDbFirst = IDbFirst.Where(lstTableNames);
            }
            var ls = IDbFirst.IsCreateDefaultValue().IsCreateAttribute()

                     .SettingClassTemplate(p => p =
                                               @"using NQI_LIMS.IServices;
using NQI_LIMS.Model;
using NQI_LIMS.Model.Models;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Linq.Expressions;
using System.Threading.Tasks;

namespace " + strNameSpace + @"
{
	[Route(""api/[controller]/[action]"")]
	[ApiController]
    [Authorize(Permissions.Name)]
     public class {ClassName}Controller : ControllerBase
        {
             /// <summary>
             /// 服务器接口,因为是模板生成,所以首字母是大写的,自己可以重构下
             /// </summary>
            private readonly I{ClassName}Services _{ClassName}Services;
    
            public {ClassName}Controller(I{ClassName}Services {ClassName}Services)
            {
                _{ClassName}Services = {ClassName}Services;
            }
    
            [HttpGet]
            public async Task<MessageModel<PageModel<{ClassName}>>> Get(int page = 1, string key = """")
            {
                if (string.IsNullOrEmpty(key) || string.IsNullOrWhiteSpace(key))
                {
                    key = """";
                }
                int intPageSize = 50;
    
                Expression<Func<{ClassName}, bool>> whereExpression = a => a.id > 0;
    
                return new MessageModel<PageModel<{ClassName}>>()
                {
                    msg = ""获取成功"",
                    success = true,
                    response = await _{ClassName}Services.QueryPage(whereExpression, page, intPageSize)
                };

    }

    [HttpGet(""{id}"")]
    public async Task<MessageModel<{ClassName}>> Get(int id = 0)
    {
        return new MessageModel<{ClassName}>()
        {
            msg = ""获取成功"",
            success = true,
            response = await _{ClassName}Services.QueryById(id)
        };
    }

    [HttpPost]
    public async Task<MessageModel<string>> Post([FromBody] {ClassName} request)
    {
        var data = new MessageModel<string>();

        var id = await _{ClassName}Services.Add(request);
        data.success = id > 0;

        if (data.success)
        {
            data.response = id.ObjToString();
            data.msg = ""添加成功"";
        }

        return data;
    }

    [HttpPut]
    public async Task<MessageModel<string>> Put([FromBody] {ClassName} request)
    {
        var data = new MessageModel<string>();
        if (request.id > 0)
        {
            data.success = await _{ClassName}Services.Update(request);
            if (data.success)
            {
                data.msg = ""更新成功"";
                data.response = request?.id.ObjToString();
            }
        }

        return data;
    }

    [HttpDelete(""{id}"")]
    public async Task<MessageModel<string>> Delete(int id = 0)
    {
        var data = new MessageModel<string>();
        if (id > 0)
        {
            var detail = await _{ClassName}Services.QueryById(id);

            detail.IsDeleted = true;

                if (detail != null)
                {
                    data.success = await _{ClassName}Services.Update(detail);
                    if (data.success)
                    {
                        data.msg = ""删除成功"";
                        data.response = detail?.id.ObjToString();
                    }
                }
        }

        return data;
    }
}
}")

                     .ToClassStringList(strNameSpace);

            CreateFilesByClassStringList(ls, strPath, "{0}Controller");

            // 20200706 切回主库
            if (!string.IsNullOrEmpty(ConnId))
            {
                sqlSugarClient.ChangeDatabase(Common.DB.MainDb.CurrentDbConnId.ToLower());
            }
        }
Exemplo n.º 12
0
        private static void DistributedTransactionExample()
        {
            Console.WriteLine("");
            Console.WriteLine("#### Distributed TransactionExample Start ####");
            SqlSugarClient db = new SqlSugarClient(new List <ConnectionConfig>()
            {
                new ConnectionConfig()
                {
                    ConfigId = "1", DbType = DbType.SqlServer, ConnectionString = Config.ConnectionString, InitKeyType = InitKeyType.Attribute, IsAutoCloseConnection = true
                },
                new ConnectionConfig()
                {
                    ConfigId = "2", DbType = DbType.SqlServer, ConnectionString = Config.ConnectionString2, InitKeyType = InitKeyType.Attribute, IsAutoCloseConnection = true
                }
            });

            //use db1
            db.CodeFirst.SetStringDefaultLength(200).InitTables(typeof(Order), typeof(OrderItem));//
            db.Insertable(new Order()
            {
                Name = "order1", CreateTime = DateTime.Now
            }).ExecuteCommand();
            Console.WriteLine(db.CurrentConnectionConfig.DbType + ":" + db.Queryable <Order>().Count());

            //use db2
            db.ChangeDatabase("2");
            db.DbMaintenance.CreateDatabase();//Create Database2
            db.CodeFirst.SetStringDefaultLength(200).InitTables(typeof(Order), typeof(OrderItem));
            db.Insertable(new Order()
            {
                Name = "order1", CreateTime = DateTime.Now
            }).ExecuteCommand();
            Console.WriteLine(db.CurrentConnectionConfig.DbType + ":" + db.Queryable <Order>().Count());

            // Example 1
            Console.WriteLine("Example 1");
            try
            {
                db.BeginTran();

                db.ChangeDatabase("1");//use db1
                db.Deleteable <Order>().ExecuteCommand();
                Console.WriteLine("---Delete all " + db.CurrentConnectionConfig.DbType);
                Console.WriteLine(db.Queryable <Order>().Count());

                db.ChangeDatabase("2");//use db2
                db.Deleteable <Order>().ExecuteCommand();
                Console.WriteLine("---Delete all " + db.CurrentConnectionConfig.DbType);
                Console.WriteLine(db.Queryable <Order>().Count());

                throw new Exception();
                db.CommitTran();
            }
            catch
            {
                db.RollbackTran();
                Console.WriteLine("---Roll back");
                db.ChangeDatabase("1");//use db1
                Console.WriteLine(db.CurrentConnectionConfig.DbType);
                Console.WriteLine(db.Queryable <Order>().Count());

                db.ChangeDatabase("2");//use db2
                Console.WriteLine(db.CurrentConnectionConfig.DbType);
                Console.WriteLine(db.Queryable <Order>().Count());
            }



            // Example 2
            Console.WriteLine("Example 2");

            var result = db.UseTran(() =>
            {
                db.ChangeDatabase("1");//use db1
                db.Deleteable <Order>().ExecuteCommand();
                Console.WriteLine("---Delete all " + db.CurrentConnectionConfig.DbType);
                Console.WriteLine(db.Queryable <Order>().Count());

                db.ChangeDatabase("2");//use db2
                db.Deleteable <Order>().ExecuteCommand();
                Console.WriteLine("---Delete all " + db.CurrentConnectionConfig.DbType);
                Console.WriteLine(db.Queryable <Order>().Count());
                throw new Exception("");
            });

            if (result.IsSuccess == false)
            {
                Console.WriteLine("---Roll back");
                db.ChangeDatabase("1");//use db1
                Console.WriteLine(db.CurrentConnectionConfig.DbType);
                Console.WriteLine(db.Queryable <Order>().Count());

                db.ChangeDatabase("2");//use db2
                Console.WriteLine(db.CurrentConnectionConfig.DbType);
                Console.WriteLine(db.Queryable <Order>().Count());
            }

            // Example 3
            Console.WriteLine("Example 3");
            Task <DbResult <bool> > result2 = AsyncTranDemo(db);

            result2.Wait();

            // Example 4
            Console.WriteLine("Example 4");
            var mysqldb     = db.GetConnection("1"); //获取ConfigId为1的数据库对象
            var sqlServerdb = db.GetConnection("2"); //获取默认对象

            Console.WriteLine(mysqldb.Queryable <Order>().Count());
            Console.WriteLine(sqlServerdb.Queryable <Order>().Count());
            try
            {
                db.BeginTran();

                sqlServerdb.Deleteable <Order>().ExecuteCommand();
                mysqldb.Deleteable <Order>().ExecuteCommand();
                Console.WriteLine(mysqldb.Queryable <Order>().Count());
                Console.WriteLine(sqlServerdb.Queryable <Order>().Count());

                throw new Exception("");
                db.CommitTran();
            }
            catch (Exception)
            {
                db.RollbackTran();//数据回滚
                Console.WriteLine(mysqldb.Queryable <Order>().Count());
                Console.WriteLine(sqlServerdb.Queryable <Order>().Count());
            }
            Console.WriteLine("#### Distributed TransactionExample End ####");
        }