Explorar el Código

修改端口,新增SqlServer测试,额外处理SqlServer数据同步自增长。新增加Nuget包FreeSql.Provider.Oracle和FreeSql.Provider.SqlServer

xiaoxue hace 5 años
padre
commit
11e87b085c

+ 6 - 4
Admin.Core.Common/Admin.Core.Common.csproj

@@ -6,10 +6,12 @@
 
   <ItemGroup>
     <PackageReference Include="CSRedisCore" Version="3.5.5" />
-    <PackageReference Include="FreeSql" Version="1.2.1" />
-    <PackageReference Include="FreeSql.Provider.MySql" Version="1.2.1" />
-    <PackageReference Include="FreeSql.Provider.Sqlite" Version="1.2.1" />
-    <PackageReference Include="FreeSql.Repository" Version="1.2.1" />
+    <PackageReference Include="FreeSql" Version="1.3.2" />
+    <PackageReference Include="FreeSql.Provider.MySql" Version="1.3.2" />
+    <PackageReference Include="FreeSql.Provider.Oracle" Version="1.3.2" />
+    <PackageReference Include="FreeSql.Provider.Sqlite" Version="1.3.2" />
+    <PackageReference Include="FreeSql.Provider.SqlServer" Version="1.3.2" />
+    <PackageReference Include="FreeSql.Repository" Version="1.3.2" />
     <PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.2.0" />
     <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="3.1.3" />
     <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.3" />

+ 2 - 2
Admin.Core.Model/Base/Entity.cs

@@ -9,9 +9,9 @@ namespace Admin.Core.Model
     public class Entity<TKey> : IEntity
     {
         /// <summary>
-        /// 主键Id
+        /// 编号
         /// </summary>
-        [Column(Position = 1)]
+        [Column(Position = 1, IsIdentity = true)]
         public virtual TKey Id { get; set; }
     }
 

+ 1 - 1
Admin.Core.Services/Admin/Auth/AuthService.cs

@@ -122,9 +122,9 @@ namespace Admin.Core.Service.Admin.Auth
                 .InnerJoin<UserRoleEntity>((a, b) => a.RoleId == b.RoleId && b.UserId == _user.Id)
                 .Include(a => a.Permission.View)
                 .Where(a => new[] { PermissionType.Group,PermissionType.Menu }.Contains(a.Permission.Type))
+                //.Distinct()
                 .OrderBy(a => a.Permission.ParentId)
                 .OrderBy(a => a.Permission.Sort)
-                .Distinct()
                 .ToListAsync(a => new
                 {
                     a.Permission.Id,

+ 1 - 1
Admin.Core/Admin.Core.Model.xml

@@ -431,7 +431,7 @@
         </member>
         <member name="P:Admin.Core.Model.Entity`1.Id">
             <summary>
-            主键Id
+            编号
             </summary>
         </member>
         <member name="T:Admin.Core.Model.EntityAdd`1">

+ 18 - 5
Admin.Core/Admin.Core.xml

@@ -569,18 +569,20 @@
             <param name="dbConfig"></param>
             <returns></returns>
         </member>
-        <member name="M:Admin.Core.Db.DbHelper.SyncStructure(IFreeSql,System.Boolean,System.String,Admin.Core.Common.Configs.DbConfig)">
+        <member name="M:Admin.Core.Db.DbHelper.SyncStructure(IFreeSql,System.String,Admin.Core.Common.Configs.DbConfig)">
             <summary>
             同步结构
             </summary>
         </member>
-        <member name="M:Admin.Core.Db.DbHelper.InitData``1(IFreeSql,``0[])">
+        <member name="M:Admin.Core.Db.DbHelper.InitDtData``1(IFreeSql,``0[],System.Data.Common.DbTransaction,Admin.Core.Common.Configs.DbConfig)">
             <summary>
-            初始化数据
+            初始化数据表数据
             </summary>
             <typeparam name="T"></typeparam>
             <param name="db"></param>
             <param name="data"></param>
+            <param name="tran"></param>
+            <param name="dbConfig"></param>
             <returns></returns>
         </member>
         <member name="M:Admin.Core.Db.DbHelper.SyncDataAuditValue(System.Object,FreeSql.Aop.AuditValueEventArgs)">
@@ -590,7 +592,7 @@
             <param name="s"></param>
             <param name="e"></param>
         </member>
-        <member name="M:Admin.Core.Db.DbHelper.SyncData(IFreeSql)">
+        <member name="M:Admin.Core.Db.DbHelper.SyncData(IFreeSql,Admin.Core.Common.Configs.DbConfig)">
             <summary>
             同步数据
             </summary>
@@ -603,12 +605,13 @@
             <param name="db"></param>
             <returns></returns>
         </member>
-        <member name="M:Admin.Core.Db.ServiceCollectionExtensions.AddDb(Microsoft.Extensions.DependencyInjection.IServiceCollection,Microsoft.Extensions.Hosting.IHostEnvironment)">
+        <member name="M:Admin.Core.Db.ServiceCollectionExtensions.AddDb(Microsoft.Extensions.DependencyInjection.IServiceCollection,Microsoft.Extensions.Hosting.IHostEnvironment,Admin.Core.Common.Configs.AppConfig)">
             <summary>
             添加数据库
             </summary>
             <param name="services"></param>
             <param name="env"></param>
+            <param name="appConfig"></param>
         </member>
         <member name="T:Admin.Core.Enums.ApiVersion">
             <summary>
@@ -670,6 +673,16 @@
             Api帮助类
             </summary>
         </member>
+        <member name="P:Admin.Core.Logs.ApiHelperDto.Label">
+            <summary>
+            接口名称
+            </summary>
+        </member>
+        <member name="P:Admin.Core.Logs.ApiHelperDto.Path">
+            <summary>
+            接口地址
+            </summary>
+        </member>
         <member name="T:Admin.Core.Logs.ILogHandler">
             <summary>
             操作日志处理接口

+ 56 - 44
Admin.Core/Db/DbHelper.cs

@@ -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");
             }

+ 11 - 5
Admin.Core/Db/ServiceCollectionExtensions.cs

@@ -16,7 +16,8 @@ namespace Admin.Core.Db
         /// </summary>
         /// <param name="services"></param>
         /// <param name="env"></param>
-        public async static void AddDb(this IServiceCollection services, IHostEnvironment env)
+        /// <param name="appConfig"></param>
+        public async static void AddDb(this IServiceCollection services, IHostEnvironment env, AppConfig appConfig)
         {
             var dbConfig = new ConfigHelper().Get<DbConfig>("dbconfig", env.EnvironmentName);
 
@@ -48,12 +49,15 @@ namespace Admin.Core.Db
 
             #region 初始化数据库
             //同步结构,需要内部配置自增长
-            DbHelper.SyncStructure(fsql, dbConfig: dbConfig);
+            if (dbConfig.SyncStructure)
+            {
+                DbHelper.SyncStructure(fsql, dbConfig: dbConfig);
+            }
 
             //同步数据
             if (dbConfig.SyncData)
             {
-                await DbHelper.SyncData(fsql);
+                await DbHelper.SyncData(fsql, dbConfig);
             }
             #endregion
 
@@ -117,11 +121,13 @@ namespace Admin.Core.Db
                 }
             };
             #endregion
-
+            
             services.AddSingleton(fsql);
             services.AddFreeRepository(filter => filter.Apply<IEntitySoftDelete>("SoftDelete", a => a.IsDeleted == false));
-            services.AddScoped<IUnitOfWork>(sp => sp.GetRequiredService<IFreeSql>().CreateUnitOfWork());
+            services.AddScoped<IUnitOfWork>(sp => fsql.CreateUnitOfWork());
             #endregion
+
+            Console.WriteLine($"{appConfig.Urls}\r\n");
         }
     }
 }

+ 6 - 0
Admin.Core/Logs/ApiHelper.cs

@@ -47,7 +47,13 @@ namespace Admin.Core.Logs
 
     public class ApiHelperDto
     {
+        /// <summary>
+        /// 接口名称
+        /// </summary>
         public string Label { get; set; }
+        /// <summary>
+        /// 接口地址
+        /// </summary>
         public string Path { get; set; }
     }
 }

+ 1 - 4
Admin.Core/Program.cs

@@ -18,10 +18,7 @@ namespace Admin.Core
         public static void Main(string[] args)
         {
             Console.WriteLine("launching...");
-            var host = CreateHostBuilder(args).Build();
-            var appConfig = new ConfigHelper().Get<AppConfig>("appconfig") ?? new AppConfig();
-            Console.WriteLine($"{appConfig.Urls}\r\n");
-            host.Run();
+            CreateHostBuilder(args).Build().Run();
         }
 
         public static IHostBuilder CreateHostBuilder(string[] args)

+ 1 - 1
Admin.Core/Properties/launchSettings.json

@@ -7,7 +7,7 @@
       "environmentVariables": {
         "ASPNETCORE_ENVIRONMENT": "Development"
       },
-      "applicationUrl": "http://localhost:8081"
+      "applicationUrl": "http://localhost:8888"
     }
   }
 }

+ 1 - 1
Admin.Core/Startup.cs

@@ -188,7 +188,7 @@ namespace Admin.Core
             #endregion
 
             //数据库
-            services.AddDb(_env);
+            services.AddDb(_env, _appConfig);
 
             #region 缓存
             var cacheConfig = new ConfigHelper().Get<CacheConfig>("cacheconfig", _env.EnvironmentName);

+ 1 - 1
Admin.Core/configs/appconfig.json

@@ -2,7 +2,7 @@
   //Swagger文档
   "swagger": false,
   //Api地址
-  "urls": "http://*:8081",
+  "urls": "http://*:8888",
   //面向切面编程
   "aop": {
     //事物

+ 8 - 4
Admin.Core/configs/dbconfig.Development.json

@@ -14,15 +14,19 @@
   "createDb": true,
   //SqlServer,PostgreSQL,Oracle,OdbcOracle,OdbcSqlServer,OdbcMySql,OdbcPostgreSQL,Odbc,OdbcDameng,MsAccess
   //建库连接字符串
-  //MySql "Server=localhost; Port=3306; Database=mysql; Uid=root; Pwd={}; Charset=utf8mb4;"
-  "createDbConnectionString": "Server=localhost; Port=3306; Database=mysql; Uid=root; Pwd=pwd; Charset=utf8mb4;",
+  //MySql "Server=localhost; Port=3306; Database=mysql; Uid=root; Pwd=pwd; Charset=utf8mb4;"
+  //SqlServer "Data Source=.;Integrated Security=True;Initial Catalog=master;Pooling=true;Min Pool Size=1"
+  "createDbConnectionString": "Data Source=.;Integrated Security=True;Initial Catalog=master;Pooling=true;Min Pool Size=1",
   //建库脚本
-  //MySql "CREATE DATABASE `{admindb}` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci'"
-  "createDbSql": "CREATE DATABASE `admindb` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci'",
+  //MySql "CREATE DATABASE `admindb` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci'"
+  //SqlServer "CREATE DATABASE [admindb]"
+  "createDbSql": "CREATE DATABASE [admindb]",
 
   //数据库类型 MySql = 0, SqlServer = 1, PostgreSQL = 2, Oracle = 3, Sqlite = 4, OdbcOracle = 5, OdbcSqlServer = 6, OdbcMySql = 7, OdbcPostgreSQL = 8, Odbc = 9, OdbcDameng = 10, MsAccess = 11
   "type": 4,
   //连接字符串
   //MySql "Server=localhost; Port=3306; Database=admindb; Uid=root; Pwd=pwd; Charset=utf8mb4;"
+  //SqlServer "Data Source=.;Integrated Security=True;Initial Catalog=admindb;Pooling=true;Min Pool Size=1"
+  //Sqlite "Data Source=|DataDirectory|\\admindb.db; Pooling=true;Min Pool Size=1"
   "connectionString": "Data Source=|DataDirectory|\\admindb.db; Pooling=true;Min Pool Size=1"
 }