public static void AddCommonDbContext <TDbContext>(this IServiceCollection services, string connectionString, DatabaseType databaseType)
            where TDbContext : DbContext
        {
            services.AddDbContext <TDbContext>((provider, builder) =>
            {
                // 微软efcore支持的数据库提供程序
                // https://docs.microsoft.com/zh-cn/ef/core/providers/
                switch (databaseType)
                {
                case DatabaseType.MySql:
                    MySqlBuilder.UseMySql(builder, connectionString, mySqlDbContextOptionsBuilder => { });
                    break;

                case DatabaseType.PostgreSql:
                    PostgreSqlBuilder.UsePostgreSql(builder, connectionString, npgsqlDbContextOptionsBuilder => { });
                    break;

                case DatabaseType.SqlLite:
                    SqlLiteBuilder.UseSqlLite(builder, connectionString, sqliteDbContextOptionsBuilder => { });
                    break;

                case DatabaseType.SqlServer:
                    SqlServerBuilder.UseSqlServer(builder, connectionString, sqlServerDbContextOptionsBuilder => { });
                    break;
                }
            });
        }
        private ISqlStatements ConstructSqlStatements(EntityMapping entityMapping)
        {
            entityMapping.FreezeMapping();

            ISqlStatements       sqlStatements;
            IStatementSqlBuilder statementSqlBuilder;

            switch (entityMapping.Dialect)
            {
            case SqlDialect.MsSql:
                statementSqlBuilder = new MsSqlBuilder(this, entityMapping);
                break;

            case SqlDialect.MySql:
                statementSqlBuilder = new MySqlBuilder(this, entityMapping);
                break;

            case SqlDialect.PostgreSql:
                statementSqlBuilder = new PostgreSqlBuilder(this, entityMapping);
                break;

            case SqlDialect.SqLite:
                statementSqlBuilder = new SqLiteBuilder(this, entityMapping);
                break;

            default:
                throw new NotSupportedException($"Dialect {entityMapping.Dialect} is not supported");
            }

            sqlStatements = new GenericSqlStatements <TEntity>(statementSqlBuilder);
            return(sqlStatements);
        }
Beispiel #3
0
        public void Ctor_TableColumnsIsEmpty()
        {
            // Arrange
            // Act
            var testModule = new PostgreSqlBuilder(null);

            // Assert
            Assert.Empty(testModule.TableColumns);
        }
Beispiel #4
0
 public PostgreSqlBuilderTests()
 {
     _tableColumns = new List <TableColumn>()
     {
         new TableColumn("FirstName", "varchar(100)", required: true),
         new TableColumn("LastName", "varchar(100)", required: true),
         new TableColumn("IsClient", "boolean"),
         new TableColumn("Phone", "varchar(100)"),
     };
     _schema     = "dbo";
     _tableName  = "tableName";
     _testModule = new PostgreSqlBuilder(_tableColumns);
     _testModule.SetSchema(_schema);
     _testModule.SetTableName(_tableName);
 }
Beispiel #5
0
        /// <summary>
        /// Returns the sql statements for an entity mapping, or the default one if the argument is null.
        /// </summary>
        public ISqlStatements GetSqlStatements(EntityMapping entityMapping = null)
        {
            entityMapping = entityMapping ?? DefaultEntityMapping;

            entityMapping.FreezeMapping();

            ISqlStatements       sqlStatements;
            IStatementSqlBuilder statementSqlBuilder;

            var originalRegisteredEntityMappings = _registeredEntityMappings;

            if (!originalRegisteredEntityMappings.TryGetValue(entityMapping, out sqlStatements))
            {
                switch (entityMapping.Dialect)
                {
                case SqlDialect.MsSql:
                    statementSqlBuilder = new MsSqlBuilder(this, entityMapping);
                    break;

                case SqlDialect.MySql:
                    statementSqlBuilder = new MySqlBuilder(this, entityMapping);
                    break;

                case SqlDialect.PostgreSql:
                    statementSqlBuilder = new PostgreSqlBuilder(this, entityMapping);
                    break;

                case SqlDialect.SqLite:
                    statementSqlBuilder = new SqLiteBuilder(this, entityMapping);
                    break;

                default:
                    throw new NotSupportedException($"Dialect {entityMapping.Dialect} is not supported");
                }

                sqlStatements = new GenericSqlStatements <TEntity>(statementSqlBuilder);

                // replace the original collection
                // rather than using a lock, we prefer the risk of missing a registration or two as they will get captured eventually
                _registeredEntityMappings = new Dictionary <EntityMapping, ISqlStatements>(originalRegisteredEntityMappings)
                {
                    [entityMapping] = sqlStatements
                };
            }
            return(sqlStatements);
        }
        /// <summary>
        /// 添加认证数据库上下文服务
        /// </summary>
        /// <typeparam name="T">用户和角色实体的主键类型</typeparam>
        /// <param name="services">服务集</param>
        /// <param name="connectionString">数据库连接串</param>
        /// <param name="databaseType">数据库类型</param>
        /// <param name="setupAction">用户认证选项</param>
        public static void AddIdentityDbContext <TDbContext, TUser, TRole, Tkey>(this IServiceCollection services, string connectionString, DatabaseType databaseType,
                                                                                 Action <IdentityOptions> setupAction = null)
            where TDbContext : IdentityDbContext <TUser, TRole, Tkey>
            where TUser : IdentityUser <Tkey>
            where TRole : IdentityRole <Tkey>
            where Tkey : IEquatable <Tkey>
        {
            services.AddDbContext <TDbContext>((provider, builder) =>
            {
                // 微软efcore支持的数据库提供程序
                // https://docs.microsoft.com/zh-cn/ef/core/providers/
                switch (databaseType)
                {
                case DatabaseType.MySql:
                    MySqlBuilder.UseMySql(builder, connectionString, mySqlDbContextOptionsBuilder => { });
                    break;

                case DatabaseType.PostgreSql:
                    PostgreSqlBuilder.UsePostgreSql(builder, connectionString, npgsqlDbContextOptionsBuilder => { });
                    break;

                case DatabaseType.SqlLite:
                    SqlLiteBuilder.UseSqlLite(builder, connectionString, sqliteDbContextOptionsBuilder => { });
                    break;

                case DatabaseType.SqlServer:
                    SqlServerBuilder.UseSqlServer(builder, connectionString, sqlServerDbContextOptionsBuilder => { });
                    break;
                }
            })
            .AddIdentity <TUser, TRole>(setupAction) // 使用user和role 进行认证
            .AddEntityFrameworkStores <TDbContext>() // 使用默认的EF的Store
            .AddDefaultTokenProviders();             // 添加默认token生成工具,用其生成的token用来进行密码重置。

            //services.AddTransient<IUserStore<BaseIdentityUser>, BaseIdentityUserStore>(); // 使用自定义userstore
            //services.AddTransient<IRoleStore<BaseIdentityRole>, BaseIdentityRoleStore>(); // 使用自定义rolestore

            services.AddApiAuthorization();                                         // 添加api认证Handler

            services.AddScoped <IPermissionCacheService, PermissionCacheService>(); // 权限缓存服务

            services.AddRepositories <TDbContext>();                                // 批量注入数据仓储

            services.AddScoped <BaseIdentityUnitOfWork>();
        }
Beispiel #7
0
        public void Ctor_TableColumnsIsNotEmpty_TableColumnsHasCorrectItems()
        {
            // Arrange
            var correctTableColumns = new List <TableColumn>()
            {
                new TableColumn("FirstName", "varchar(100)", required: true),
                new TableColumn("LastName", "varchar(100)", required: true),
                new TableColumn("IsClient", "boolean"),
                new TableColumn("Phone", "varchar(100)"),
            };
            var testModule = new PostgreSqlBuilder(correctTableColumns);
            // Act
            var tableColumns = testModule.TableColumns;

            // Assert
            Assert.Contains(tableColumns, e => e.Name == "FirstName");
            Assert.Contains(tableColumns, e => e.Name == "LastName");
            Assert.Contains(tableColumns, e => e.Name == "IsClient");
            Assert.Contains(tableColumns, e => e.Name == "Phone");
        }
Beispiel #8
0
        static async Task Main(string[] args)
        {
            try
            {
                var version = Assembly.GetEntryAssembly().GetCustomAttribute <AssemblyInformationalVersionAttribute>()
                              .InformationalVersion;

                Console.WriteLine("j2s - JSON to SQL files transformer.");
                Console.WriteLine($"Version: {version}");
                Console.WriteLine();
                Console.WriteLine("Arguments:");
                Console.WriteLine("\t--source-json=<path>               Full path to source *.json file");
                Console.WriteLine("\t--source-json-type=<type>          One of available source JSON file types");
                Console.WriteLine("\t--target-sql=<sql>                 One of available target SQL databases");
                Console.WriteLine("\t--table-name=<name>                Name of SQL table");
                Console.WriteLine("\t--schema=<schema_name>             Name of SQL table schema");
                Console.WriteLine("\t--limit-inserts=<number>           Max rows in INSERT statement per 1 *.sql file");
                Console.WriteLine("\t--columns-definition-file=<path>   Full path to *.json file for SQL table columns definition");
                Console.WriteLine();

                if (args == null || args.Length == 0)
                {
                    return;
                }

                var jsonSourceFilePath = GetArgumentValue("--source-json", args);
                var jsonSourceFileType = GetArgumentValue("--source-json-type", args);
                if (!AvailableSourceJsonFileTypes.ContainsKey(jsonSourceFileType))
                {
                    var errorBuilder = new StringBuilder();
                    errorBuilder.Append("Sorry, but now supports only next source json file types:");
                    foreach (var item in AvailableSourceJsonFileTypes)
                    {
                        errorBuilder.Append($"\n  * {item.Key} - {item.Value};");
                    }

                    throw new ArgumentException(errorBuilder.ToString());
                }

                var targetSqlType = GetArgumentValue("--target-sql", args);
                if (!AvailableSqlTypes.ContainsKey(targetSqlType))
                {
                    var errorBuilder = new StringBuilder();
                    errorBuilder.Append("Sorry, but now supports only next SQL databases:");
                    foreach (var item in AvailableSqlTypes)
                    {
                        errorBuilder.Append($"\n  * {item.Key} - {item.Value};");
                    }

                    throw new ArgumentException(errorBuilder.ToString());
                }

                var tableName    = GetArgumentValue("--table-name", args);
                var schema       = GetArgumentValue("--schema", args);
                var limitInserts = Convert.ToInt32(GetArgumentValue("--limit-inserts", args));
                var columnsDefinitionFilePath = GetArgumentValue("--columns-definition-file", args);
                var tableColumns = ParseTableDeColumnsDefinition(columnsDefinitionFilePath);

                var jsonFileReader = new MongoDbCompass_1_17_0_JsonFileReader();
                var fileWriter     = new FileWriter();
                var sqlBuilder     = new PostgreSqlBuilder(tableColumns);

                var transformer =
                    new Json2SqlTransformer(jsonFileReader, fileWriter, sqlBuilder);

                var transformOptions = new Json2SqlTransformOptions()
                {
                    SourceJsonFilePath = jsonSourceFilePath,
                    TableName          = tableName,
                    TableSchema        = schema,
                    MaxLinesPer1InsertValuesSqlFile = limitInserts
                };

                var transformResult = await transformer.ExecuteAsync(transformOptions);

                if (transformResult.Success)
                {
                    Console.WriteLine("Transform success!");
                }
                else
                {
                    Error(transformResult.ToString());
                }
            }
            catch (Exception ex)
            {
                Error(ex.Message);
            }

            Console.WriteLine("\nPress any key for exit...");
            Console.ReadLine();
        }