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