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); } } } }
private void ImplementGetSaveMethodTypeMethod(IClassBuilder entityClass, PropertyInfo pkProperty) { var method = entityClass.ImplementsMethod(typeof(IEntity).GetMethod(nameof(IEntity.GetSaveMethodType))) .WithModifier("public"); if (!PkHandlingHelper.IsPkAutogenerated(pkProperty)) { method.Body.Write("return ") .Write(typeof(SaveMethodType)) .Write(".") .Write(nameof(SaveMethodType.Merge)) .EndStatement(); return; } method.Body.Write("return ").Write(pkProperty.Name).Write(" == ").Write("default(").Write(pkProperty.PropertyType).Write(") ?") .Write(typeof(SaveMethodType)).Write(".").Write(nameof(SaveMethodType.Insert)).Write(" : ") .Write(typeof(SaveMethodType)).Write(".").Write(nameof(SaveMethodType.Update)).EndStatement(); }
private void ImplementIsPkAuto(IClassBuilder entityClass, PropertyInfo pkProperty) { var value = PkHandlingHelper.IsPkAutogenerated(pkProperty); entityClass.HasPublicProperty <bool>(nameof(IEntity.IsPrimaryKeyAutogenerated)).Returns(p => p.Write(value)); }