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); }
/// <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); }
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); }
/// <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()); } }
/// <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()); } }
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); } }
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()); } }
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 ####"); }
/// <summary> /// 对外的扩展操作 /// </summary> public LogRepository(ISqlSugarClient sqlSugar) { _dbBase = sqlSugar as SqlSugarClient; _dbBase.ChangeDatabase(AppConfigurtaionService.Configuration["ConnectionStrings:DefaultLogDBConfigId"]);// 切换到日志库标记 }
/// <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()); } }
/// <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()); } }
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 ####"); }