Esempio n. 1
0
        public void MigrateStructure(IServiceLocator locator, IMigrationScriptBuilder script)
        {
            var collector = locator.Get <IEntityCollector>();

            if (collector == null)
            {
                throw new InvalidOperationException($"Provided locator doesn't have {typeof(IEntityCollector)}");
            }

            var entities = collector.GetEntityTypes().ToList();

            foreach (var entity in entities)
            {
                var table = m_dataModel.GetTableName(entity);

                var pk = m_convention.GetPrimaryKeyProperty(entity);

                script.CreateTable(
                    table,
                    m_dataModel.GetColumnName(pk),
                    pk.PropertyType,
                    PkHandlingHelper.IsPkAutogenerated(pk));

                var relations = m_dataModel.GetReferences(entity).ToList();

                var columns = m_dataModel.GetTableDataColumns(entity);
                foreach (var column in columns)
                {
                    try
                    {
                        if (column == pk)
                        {
                            continue;
                        }

                        var type       = SqlTypeMapper.GetColumnType(column);
                        var columnName = m_convention.GetColumnName(column);
                        script.CreateColumn(table, columnName, type.ColumnDeclarationTypeText, type.IsNullable, false);

                        var references =
                            relations.Where(r => (r.LeftEntityType == entity) && (r.LeftKeyColumnName == columnName));

                        foreach (var relation in references)
                        {
                            script.CreateForeignKey(
                                table,
                                columnName,
                                m_dataModel.GetTableName(relation.RightEntityType),
                                relation.RightKeyColumnName);
                        }
                    }
                    catch (Exception ex)
                    {
                        throw new InvalidOperationException($"Schema migration failed, table={table}, column={column}", ex);
                    }
                }
            }
        }
Esempio n. 2
0
        public static TSqlType CreateFromType(Type type)
        {
            if (SqlTypeMapper.TryGetDbType(type, out var dbType))
            {
                return(CreateFromType(dbType));
            }

            throw new ArgumentException($"{type.FullName} is not a supported CLR type");
        }
Esempio n. 3
0
        public void Render(StringBuilder sb)
        {
            var sqlTypeName = SqlTypeMapper.GetSqlTypeName(m_targetType, 0);

            if (string.IsNullOrWhiteSpace(sqlTypeName))
            {
                m_operand.Render(sb);
                return;
            }

            sb.Append("CAST(");
            m_operand.Render(sb);
            sb.Append(" AS ");
            sb.Append(sqlTypeName);
            sb.Append(")");
        }
        public void CreateTable(string tableName, string pkColumnName, Type pkColumnType, bool pkAutogenerated)
        {
            var identity   = string.Empty;
            var pkTypeName = SqlTypeMapper.GetSqlTypeName(pkColumnType, 0);

            if (pkAutogenerated)
            {
                identity = "IDENTITY(1,1) ";
            }

            m_tablesBuilder.AppendLine($"IF NOT EXISTS(SELECT TOP 1 1 FROM sys.tables WHERE name = '{tableName}')");
            m_tablesBuilder.AppendLine("BEGIN");
            m_tablesBuilder.Append("\t");
            m_tablesBuilder.AppendLine($"CREATE TABLE [{tableName}] ([{pkColumnName}] {pkTypeName} {identity}NOT NULL, ");
            m_tablesBuilder.AppendLine(
                $"\tCONSTRAINT [PK_{tableName}] PRIMARY KEY CLUSTERED ([{pkColumnName}] ASC) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]");
            m_tablesBuilder.AppendLine("\t);");
            m_tablesBuilder.AppendLine("END");
            m_tablesBuilder.AppendLine();
        }
Esempio n. 5
0
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IMapper autoMapper, IOptions <SwaggerOptionsConfig> swaggerOptionsConfig)
        {
            if (Environment.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseCustomExceptionMiddleware();
            app.UseHttpsRedirection();
            // https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/?view=aspnetcore-2.2#order
            app.UseStaticFiles();
            //app.UseCookiePolicy();
            app.UseSerilogRequestLogging();
            app.UseRouting();

            app.UseAuthentication();
            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers().RequireAuthorization();
            });

            app.UseSwagger();

            app.UseSwaggerUI(c =>
            {
                c.SwaggerEndpoint(swaggerOptionsConfig.Value.JsonRoute, swaggerOptionsConfig.Value.EndpointName);
                c.RoutePrefix = swaggerOptionsConfig.Value.RoutePrefix;
            });

            autoMapper.ConfigurationProvider.AssertConfigurationIsValid();

            SqlTypeMapper.SetupTypesMappingAndHandlers();

            // Type Descriptors
            TypeDescriptor.AddAttributes(typeof(DateTime), new TypeConverterAttribute(typeof(UtcDateTimeConverter)));

            app.AddNpgsqlLogManager();
        }
Esempio n. 6
0
        public bool IsColumn(PropertyInfo property)
        {
            var propType = property.PropertyType;

            var nType = Nullable.GetUnderlyingType(propType);

            if (nType != null)
            {
                propType = nType;
            }

            if (propType.IsInterface || propType.IsAbstract)
            {
                return(false);
            }

            if (property.GetCustomAttributes().OfType <IDbTypeAttribute>().Any())
            {
                return(true);
            }

            return(SqlTypeMapper.GetSqlTypeMappingExists(propType));
        }
Esempio n. 7
0
        protected override object InsertEntity(IEntity entity, ITransaction <SqlConnection> transaction)
        {
            var values = entity.GetValues().Where(v => !v.IsPk).ToList();

            var columnsList = string.Join(", ", values.Select(i => $"[{i.ColumnName}]"));
            var paramList   = string.Join(", ", values.Select(i => $"@{i.ColumnName}"));

            var sql =
                $"INSERT INTO [{entity.DbEntityName}] ({columnsList}) VALUES ({paramList}); SELECT CAST(SCOPE_IDENTITY() AS {SqlTypeMapper.GetSqlTypeName(entity.PrimaryKeyType, 0)});";

            using (var command = new SqlCommand(sql, transaction.GetConnection()))
            {
                foreach (var entityColumnValue in values)
                {
                    command.Parameters.AddWithValue($"@{entityColumnValue.ColumnName}", entityColumnValue.Value ?? DBNull.Value);
                }

                var newPk = command.ExecuteScalar();
                entity.PrimaryKeyValue = newPk;

                return(newPk);
            }
        }