public void DoChangeValueTypeProperty_To_NotNullable(ObjectClass objClass, ValueTypeProperty prop, string prefix) { var tblName = db.GetTableName(objClass.Module.SchemaName, objClass.TableName); var colName = Construct.NestedColumnName(prop, prefix); if (db.CheckColumnContainsNulls(tblName, colName)) { Log.ErrorFormat("column '{0}.{1}' contains NULL values, cannot set NOT NULLABLE", tblName, colName); } else { db.AlterColumn(tblName, colName, prop.GetDbType(), prop.GetSize(), prop.GetScale(), prop.IsNullable(), null); } }
public void DoChangeValueTypeProperty_To_Nullable(ObjectClass objClass, ValueTypeProperty prop, string prefix) { var tblName = db.GetTableName(objClass.Module.SchemaName, objClass.TableName); var colName = Construct.NestedColumnName(prop, prefix); db.AlterColumn(tblName, colName, prop.GetDbType(), prop.GetSize(), prop.GetScale(), prop.IsNullable(), null); }
public void DoNewValueTypePropertyNotNullable(ObjectClass objClass, ValueTypeProperty prop, string prefix) { var tblName = db.GetTableName(objClass.Module.SchemaName, objClass.TableName); var colName = Construct.NestedColumnName(prop, prefix); var dbType = prop.GetDbType(); var size = prop.GetSize(); var scale = prop.GetScale(); var def = SchemaManager.GetDefaultConstraint(prop); Log.InfoFormat("New not nullable ValueType Property: [{0}.{1}] (col:{2})", prop.ObjectClass.Name, prop.Name, colName); if (!db.CheckTableContainsData(tblName)) { db.CreateColumn(tblName, colName, dbType, size, scale, false, def); } else { db.CreateColumn(tblName, colName, dbType, size, scale, true, def); Log.ErrorFormat("unable to create new not nullable ValueType Property '{0}' when table '{1}' contains data. Created nullable column instead.", colName, tblName); } }
public void DoNewValueTypePropertyNullable(ObjectClass objClass, ValueTypeProperty prop, string prefix) { string colName = Construct.NestedColumnName(prop, prefix); Log.InfoFormat("New nullable ValueType Property: '{0}' ('{1}')", prop.Name, colName); db.CreateColumn(db.GetTableName(objClass.Module.SchemaName, objClass.TableName), colName, prop.GetDbType(), prop.GetSize(), prop.GetScale(), true, SchemaManager.GetDefaultConstraint(prop)); }
public void DoMoveValueTypeProperty(ObjectClass objClass, ValueTypeProperty prop, string prefix) { var saved = savedSchema.FindPersistenceObject<ValueTypeProperty>(prop.ExportGuid); // Refleced changed hierarchie var currentOriginObjClass = schema.FindPersistenceObject<ObjectClass>(saved.ObjectClass.ExportGuid); var movedUp = IsParentOf(objClass, currentOriginObjClass); var movedDown = IsParentOf(currentOriginObjClass, objClass); var tblName = db.GetTableName(objClass.Module.SchemaName, objClass.TableName); var srcTblName = db.GetTableName(saved.Module.SchemaName, ((ObjectClass)saved.ObjectClass).TableName); var colName = Construct.NestedColumnName(prop, prefix); var srcColName = Construct.NestedColumnName(saved, prefix); // TODO: What if prefix has changed var dbType = prop.GetDbType(); var size = prop.GetSize(); var scale = prop.GetScale(); var defConstr = SchemaManager.GetDefaultConstraint(prop); if (movedUp) { Log.InfoFormat("Moving property '{0}' from '{1}' up to '{2}'", prop.Name, saved.ObjectClass.Name, objClass.Name); db.CreateColumn(tblName, colName, dbType, size, scale, true, defConstr); db.CopyColumnData(srcTblName, srcColName, tblName, colName); if (!prop.IsNullable()) { if (db.CheckColumnContainsNulls(tblName, colName)) { Log.ErrorFormat("column '{0}.{1}' contains NULL values, cannot set NOT NULLABLE", tblName, colName); } else { db.AlterColumn(tblName, colName, dbType, size, scale, prop.IsNullable(), defConstr); } } if (db.CheckColumnExists(srcTblName, srcColName)) db.DropColumn(srcTblName, srcColName); } else if (movedDown) { Log.InfoFormat("Moving property '{0}' from '{1}' down to '{2}' (dataloss possible)", prop.Name, saved.ObjectClass.Name, objClass.Name); db.CreateColumn(tblName, colName, dbType, size, scale, true, defConstr); db.CopyColumnData(srcTblName, srcColName, tblName, colName); if (!prop.IsNullable()) { db.AlterColumn(tblName, colName, dbType, size, scale, prop.IsNullable(), defConstr); } if (db.CheckColumnExists(srcTblName, srcColName)) db.DropColumn(srcTblName, srcColName); } else { Log.ErrorFormat("Moving property '{2}' from '{0}' to '{1}' is not supported. ObjectClasses are not in the same hierarchy. Will only create destination column.", saved.ObjectClass.Name, prop.ObjectClass.Name, prop.Name); db.CreateColumn(tblName, colName, dbType, size, scale, true, defConstr); } }
public void DoNewValueTypePropertyList(ObjectClass objClass, ValueTypeProperty prop) { Log.InfoFormat("New ValueType Property List: {0}", prop.Name); var tblName = db.GetTableName(prop.Module.SchemaName, prop.GetCollectionEntryTable()); string fkName = prop.GetCollectionEntryReverseKeyColumnName(); string valPropName = prop.Name; string valPropIndexName = prop.Name + "Index"; string assocName = prop.GetAssociationName(); bool hasPersistentOrder = prop.HasPersistentOrder; db.CreateTable(tblName, true); db.CreateColumn(tblName, fkName, System.Data.DbType.Int32, 0, 0, false); db.CreateColumn(tblName, valPropName, prop.GetDbType(), prop.GetSize(), prop.GetScale(), false, SchemaManager.GetDefaultConstraint(prop)); if (hasPersistentOrder) { db.CreateColumn(tblName, valPropIndexName, System.Data.DbType.Int32, 0, 0, false); } db.CreateFKConstraint(tblName, db.GetTableName(objClass.Module.SchemaName, objClass.TableName), fkName, assocName, true); db.CreateIndex(tblName, Construct.IndexName(tblName.Name, fkName), false, false, fkName); }
public void DoChangeDefaultValue(ObjectClass objClass, ValueTypeProperty prop, string prefix) { var savedProp = savedSchema.FindPersistenceObject<Property>(prop.ExportGuid); if (!PreMigration(PropertyMigrationEventType.ChangeDefaultValueDefinition, savedProp, prop)) return; var tblName = objClass.GetTableRef(db); var colName = Construct.ColumnName(prop, prefix); // Use current nullable definition. // Another case is responsible to change that. var currentIsNullable = db.GetIsColumnNullable(tblName, colName); db.AlterColumn(tblName, colName, prop.GetDbType(), prop.GetSize(), prop.GetScale(), currentIsNullable, SchemaManager.GetDefaultConstraint(prop)); PostMigration(PropertyMigrationEventType.ChangeDefaultValueDefinition, savedProp, prop); }
public void DoChangeDefaultValue(ObjectClass objClass, ValueTypeProperty prop, string prefix) { var tblName = db.GetTableName(objClass.Module.SchemaName, objClass.TableName); var colName = Construct.NestedColumnName(prop, prefix); // Use current nullable definition. // Another case is responsible to change that. var currentIsNullable = db.GetIsColumnNullable(tblName, colName); db.AlterColumn(tblName, colName, prop.GetDbType(), prop.GetSize(), prop.GetScale(), currentIsNullable, SchemaManager.GetDefaultConstraint(prop)); }
private void CreateValueTypePropertyNullable(TableRef tblName, ValueTypeProperty prop, string colName, bool withDefault) { db.CreateColumn(tblName, colName, prop.GetDbType(), prop.GetSize(), prop.GetScale(), true, withDefault ? SchemaManager.GetDefaultConstraint(prop) : null); }
public void DoNewValueTypePropertyNotNullable(ObjectClass objClass, ValueTypeProperty prop, string prefix) { if (!PreMigration(PropertyMigrationEventType.Add, null, prop)) return; var tblName = objClass.GetTableRef(db); var colName = Construct.ColumnName(prop, prefix); var dbType = prop.GetDbType(); var size = prop.GetSize(); var scale = prop.GetScale(); var def = SchemaManager.GetDefaultConstraint(prop); var isSimplyCheckable = objClass.GetTableMapping() == TableMapping.TPT || objClass.BaseObjectClass == null; bool updateDone = false; // classes that do have this property var classes = objClass.AndChildren(c => c.SubClasses).Select(cls => Construct.DiscriminatorValue(cls)).ToList(); Log.InfoFormat("New not nullable ValueType Property: [{0}.{1}] (col:{2})", prop.ObjectClass.Name, prop.Name, colName); CheckValueTypePropertyHasWarnings(prop); if (db.CheckTableContainsData(tblName, isSimplyCheckable ? null : classes)) { db.CreateColumn(tblName, colName, dbType, size, scale, true, isSimplyCheckable ? def : null); updateDone = WriteDefaultValue(tblName, colName, def, isSimplyCheckable ? null : classes); } else { db.CreateColumn(tblName, colName, dbType, size, scale, !isSimplyCheckable, isSimplyCheckable ? def : null); updateDone = true; } if (updateDone && isSimplyCheckable) { db.AlterColumn(tblName, colName, dbType, size, scale, false, def); } else if (updateDone && !isSimplyCheckable) { CreateTPHNotNullCheckConstraint(tblName, colName, objClass); } else if (!updateDone && isSimplyCheckable) { Log.ErrorFormat("unable to set ValueType Property '{0}' to NOT NULL when table '{1}' contains data: No supported default constraint found", colName, tblName); } else if (!updateDone && !isSimplyCheckable) { Log.ErrorFormat("unable to create CHECK constraint on ValueType Property '{0}' when table '{1}' contains data: No supported default constraint found", colName, tblName); } PostMigration(PropertyMigrationEventType.Add, null, prop); }
public void DoNewValueTypePropertyList(ObjectClass objClass, ValueTypeProperty prop) { if (!PreMigration(PropertyMigrationEventType.Add, null, prop)) return; Log.InfoFormat("New ValueType Property List: {0}", prop.Name); CheckValueTypePropertyHasWarnings(prop); var tblName = db.GetTableName(prop.Module.SchemaName, prop.GetCollectionEntryTable()); string fkName = Construct.ForeignKeyColumnName(prop); string valPropName = prop.Name; string valPropIndexName = prop.Name + "Index"; string assocName = prop.GetAssociationName(); bool hasPersistentOrder = prop.HasPersistentOrder; db.CreateTable(tblName, true); db.CreateColumn(tblName, fkName, System.Data.DbType.Int32, 0, 0, false); db.CreateColumn(tblName, valPropName, prop.GetDbType(), prop.GetSize(), prop.GetScale(), false, SchemaManager.GetDefaultConstraint(prop)); if (hasPersistentOrder) { db.CreateColumn(tblName, valPropIndexName, System.Data.DbType.Int32, 0, 0, false); } db.CreateFKConstraint(tblName, objClass.GetTableRef(db), fkName, assocName, true); db.CreateIndex(tblName, Construct.IndexName(tblName.Name, fkName), false, false, fkName); PostMigration(PropertyMigrationEventType.Add, null, prop); }
public void DoChangeValueTypeProperty_To_Nullable(ObjectClass objClass, ValueTypeProperty prop, string prefix) { var savedProp = savedSchema.FindPersistenceObject<ValueTypeProperty>(prop.ExportGuid); if (!PreMigration(PropertyMigrationEventType.ChangeToNullable, savedProp, prop)) return; var tblName = objClass.GetTableRef(db); var colName = Construct.ColumnName(prop, prefix); db.AlterColumn(tblName, colName, prop.GetDbType(), prop.GetSize(), prop.GetScale(), prop.IsNullable(), null); PostMigration(PropertyMigrationEventType.ChangeToNullable, savedProp, prop); }
public void DoChangeValueTypeProperty_To_NotNullable(ObjectClass objClass, ValueTypeProperty prop, string prefix) { var savedProp = savedSchema.FindPersistenceObject<ValueTypeProperty>(prop.ExportGuid); if (!PreMigration(PropertyMigrationEventType.ChangeToNotNullable, savedProp, prop)) return; var tblName = objClass.GetTableRef(db); var colName = Construct.ColumnName(prop, prefix); var def = SchemaManager.GetDefaultConstraint(prop); if (def == null && db.CheckColumnContainsNulls(tblName, colName)) { Log.ErrorFormat("column '{0}.{1}' contains NULL values and has no default contraint, cannot set NOT NULLABLE", tblName, colName); } else { if (def != null) { var isSimplyCheckable = objClass.GetTableMapping() == TableMapping.TPT || objClass.BaseObjectClass == null; var classes = objClass.AndChildren(c => c.SubClasses).Select(cls => Construct.DiscriminatorValue(cls)).ToList(); WriteDefaultValue(tblName, colName, def, isSimplyCheckable ? null : classes); } db.AlterColumn(tblName, colName, prop.GetDbType(), prop.GetSize(), prop.GetScale(), prop.IsNullable(), null /* don't change contraints */); } PostMigration(PropertyMigrationEventType.ChangeToNotNullable, savedProp, prop); }