|  | @@ -27,14 +27,14 @@ namespace Admin.Core.Db
 | 
	
		
			
				|  |  |                  return;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            var fsql = new FreeSqlBuilder()
 | 
	
		
			
				|  |  | +            var db = new FreeSqlBuilder()
 | 
	
		
			
				|  |  |                      .UseConnectionString(dbConfig.Type, dbConfig.CreateDbConnectionString)
 | 
	
		
			
				|  |  |                      .Build();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              try
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  |                  Console.WriteLine("\r\ncreate database started");
 | 
	
		
			
				|  |  | -                await fsql.Ado.ExecuteNonQueryAsync(dbConfig.CreateDbSql);
 | 
	
		
			
				|  |  | +                await db.Ado.ExecuteNonQueryAsync(dbConfig.CreateDbSql);
 | 
	
		
			
				|  |  |                  Console.WriteLine("create database succeed\r\n");
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              catch (Exception e)
 | 
	
	
		
			
				|  | @@ -46,7 +46,7 @@ namespace Admin.Core.Db
 | 
	
		
			
				|  |  |          /// <summary>
 | 
	
		
			
				|  |  |          /// 同步结构
 | 
	
		
			
				|  |  |          /// </summary>
 | 
	
		
			
				|  |  | -        public static void SyncStructure(IFreeSql db,bool autoIncrement = true, string msg = null, DbConfig dbConfig = null)
 | 
	
		
			
				|  |  | +        public static void SyncStructure(IFreeSql db, string msg = null, DbConfig dbConfig = null)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              //打印结构比对脚本
 | 
	
		
			
				|  |  |              //var dDL = db.CodeFirst.GetComparisonDDLStatements<PermissionEntity>();
 | 
	
	
		
			
				|  | @@ -61,7 +61,10 @@ namespace Admin.Core.Db
 | 
	
		
			
				|  |  |              //    }
 | 
	
		
			
				|  |  |              //};
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            var types = new Type[]
 | 
	
		
			
				|  |  | +            // 同步结构
 | 
	
		
			
				|  |  | +            var dbType = dbConfig.Type.ToString();
 | 
	
		
			
				|  |  | +            Console.WriteLine($"\r\n{(msg.NotNull() ? msg : $"sync {dbType} structure")} started");
 | 
	
		
			
				|  |  | +            db.CodeFirst.SyncStructure(new Type[]
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  |                  typeof(DictionaryEntity),
 | 
	
		
			
				|  |  |                  typeof(ApiEntity),
 | 
	
	
		
			
				|  | @@ -73,40 +76,25 @@ namespace Admin.Core.Db
 | 
	
		
			
				|  |  |                  typeof(RolePermissionEntity),
 | 
	
		
			
				|  |  |                  typeof(OprationLogEntity),
 | 
	
		
			
				|  |  |                  typeof(LoginLogEntity)
 | 
	
		
			
				|  |  | -            };
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            foreach (var type in types)
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                try
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                    db.CodeFirst.ConfigEntity(type, a =>
 | 
	
		
			
				|  |  | -                    {
 | 
	
		
			
				|  |  | -                        a.Property("Id").IsIdentity(autoIncrement);
 | 
	
		
			
				|  |  | -                    });
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -                catch (Exception)
 | 
	
		
			
				|  |  | -                {
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            // 同步结构
 | 
	
		
			
				|  |  | -            if (dbConfig.SyncStructure)
 | 
	
		
			
				|  |  | -            {
 | 
	
		
			
				|  |  | -                var dbType = dbConfig.Type.ToString();
 | 
	
		
			
				|  |  | -                Console.WriteLine($"\r\n{(msg.NotNull() ? msg : $"sync {dbType} structure")} started");
 | 
	
		
			
				|  |  | -                db.CodeFirst.SyncStructure(types);
 | 
	
		
			
				|  |  | -                Console.WriteLine($"{(msg.NotNull() ? msg : $"sync {dbType} structure")} succeed\r\n");
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | +            });
 | 
	
		
			
				|  |  | +            Console.WriteLine($"{(msg.NotNull() ? msg : $"sync {dbType} structure")} succeed\r\n");
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          /// <summary>
 | 
	
		
			
				|  |  | -        /// 初始化数据
 | 
	
		
			
				|  |  | +        /// 初始化数据表数据
 | 
	
		
			
				|  |  |          /// </summary>
 | 
	
		
			
				|  |  |          /// <typeparam name="T"></typeparam>
 | 
	
		
			
				|  |  |          /// <param name="db"></param>
 | 
	
		
			
				|  |  |          /// <param name="data"></param>
 | 
	
		
			
				|  |  | +        /// <param name="tran"></param>
 | 
	
		
			
				|  |  | +        /// <param name="dbConfig"></param>
 | 
	
		
			
				|  |  |          /// <returns></returns>
 | 
	
		
			
				|  |  | -        private static async Task InitData<T>(IFreeSql db,T[] data) where T : class
 | 
	
		
			
				|  |  | +        private static async Task InitDtData<T>(
 | 
	
		
			
				|  |  | +            IFreeSql db, 
 | 
	
		
			
				|  |  | +            T[] data, 
 | 
	
		
			
				|  |  | +            System.Data.Common.DbTransaction tran, 
 | 
	
		
			
				|  |  | +            DbConfig dbConfig = null
 | 
	
		
			
				|  |  | +        ) where T : class
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              var table = typeof(T).GetCustomAttributes(typeof(TableAttribute),false).FirstOrDefault() as TableAttribute;
 | 
	
		
			
				|  |  |              var tableName = table.Name;
 | 
	
	
		
			
				|  | @@ -117,7 +105,23 @@ namespace Admin.Core.Db
 | 
	
		
			
				|  |  |                  {
 | 
	
		
			
				|  |  |                      if (data?.Length > 0)
 | 
	
		
			
				|  |  |                      {
 | 
	
		
			
				|  |  | -                        await db.Insert<T>().AppendData(data).ExecuteAffrowsAsync();
 | 
	
		
			
				|  |  | +                        var insert = db.Insert<T>();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                        if(tran != null)
 | 
	
		
			
				|  |  | +                        {
 | 
	
		
			
				|  |  | +                            insert = insert.WithTransaction(tran);
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                        if(dbConfig.Type == DataType.SqlServer)
 | 
	
		
			
				|  |  | +                        {
 | 
	
		
			
				|  |  | +                            var insrtSql = insert.AppendData(data).InsertIdentity().ToSql();
 | 
	
		
			
				|  |  | +                            await db.Ado.ExecuteNonQueryAsync($"SET IDENTITY_INSERT {tableName} ON\n {insrtSql} \nSET IDENTITY_INSERT {tableName} OFF");
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                        else
 | 
	
		
			
				|  |  | +                        {
 | 
	
		
			
				|  |  | +                            await insert.AppendData(data).InsertIdentity().ExecuteAffrowsAsync();
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                        
 | 
	
		
			
				|  |  |                          Console.WriteLine($"table: {tableName} sync data succeed");
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                      else
 | 
	
	
		
			
				|  | @@ -173,31 +177,39 @@ namespace Admin.Core.Db
 | 
	
		
			
				|  |  |          /// 同步数据
 | 
	
		
			
				|  |  |          /// </summary>
 | 
	
		
			
				|  |  |          /// <returns></returns>
 | 
	
		
			
				|  |  | -        public static async Task SyncData(IFreeSql db)
 | 
	
		
			
				|  |  | +        public static async Task SyncData(IFreeSql db, DbConfig dbConfig = null)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              try
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | +                //db.Aop.CurdBefore += (s, e) =>
 | 
	
		
			
				|  |  | +                //{
 | 
	
		
			
				|  |  | +                //    Console.WriteLine($"{e.Sql}\r\n");
 | 
	
		
			
				|  |  | +                //};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |                  Console.WriteLine("\r\nsync data started");
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  db.Aop.AuditValue += SyncDataAuditValue;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                SyncStructure(db, false ,"sync structure for sync data");
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |                  var filePath = Path.Combine(Directory.GetCurrentDirectory(), @"Db\Data\data.json");
 | 
	
		
			
				|  |  |                  var jsonData = FileHelper.ReadFile(filePath);
 | 
	
		
			
				|  |  |                  var data = JsonConvert.DeserializeObject<Data>(jsonData);
 | 
	
		
			
				|  |  | -                await InitData(db, data.Dictionaries);
 | 
	
		
			
				|  |  | -                await InitData(db, data.Apis);
 | 
	
		
			
				|  |  | -                await InitData(db, data.Views);
 | 
	
		
			
				|  |  | -                await InitData(db, data.Permissions);
 | 
	
		
			
				|  |  | -                await InitData(db, data.Users);
 | 
	
		
			
				|  |  | -                await InitData(db, data.Roles);
 | 
	
		
			
				|  |  | -                await InitData(db, data.UserRoles);
 | 
	
		
			
				|  |  | -                await InitData(db, data.RolePermissions);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                db.Aop.AuditValue -= SyncDataAuditValue;
 | 
	
		
			
				|  |  | +                using (var uow = db.CreateUnitOfWork())
 | 
	
		
			
				|  |  | +                using (var tran = uow.GetOrBeginTransaction())
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    await InitDtData(db, data.Dictionaries, tran, dbConfig);
 | 
	
		
			
				|  |  | +                    await InitDtData(db, data.Apis, tran, dbConfig);
 | 
	
		
			
				|  |  | +                    await InitDtData(db, data.Views, tran, dbConfig);
 | 
	
		
			
				|  |  | +                    await InitDtData(db, data.Permissions, tran, dbConfig);
 | 
	
		
			
				|  |  | +                    await InitDtData(db, data.Users, tran, dbConfig);
 | 
	
		
			
				|  |  | +                    await InitDtData(db, data.Roles, tran, dbConfig);
 | 
	
		
			
				|  |  | +                    await InitDtData(db, data.UserRoles, tran, dbConfig);
 | 
	
		
			
				|  |  | +                    await InitDtData(db, data.RolePermissions, tran, dbConfig);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    uow.Commit();
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                SyncStructure(db, true, "sync structure for sync data");
 | 
	
		
			
				|  |  | +                db.Aop.AuditValue -= SyncDataAuditValue;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  Console.WriteLine("sync data succeed\r\n");
 | 
	
		
			
				|  |  |              }
 |