diff --git a/src/Orchard/Data/Migration/Interpreters/DefaultDataMigrationInterpreter.cs b/src/Orchard/Data/Migration/Interpreters/DefaultDataMigrationInterpreter.cs index d6dfacbe7..e3f5d958c 100644 --- a/src/Orchard/Data/Migration/Interpreters/DefaultDataMigrationInterpreter.cs +++ b/src/Orchard/Data/Migration/Interpreters/DefaultDataMigrationInterpreter.cs @@ -125,41 +125,54 @@ namespace Orchard.Data.Migration.Interpreters { return; } - // drop columns + // Drop columns. foreach (var dropColumn in command.TableCommands.OfType()) { var builder = new StringBuilder(); Visit(builder, dropColumn); RunPendingStatements(); } - // add columns + // Add columns. foreach (var addColumn in command.TableCommands.OfType()) { var builder = new StringBuilder(); Visit(builder, addColumn); RunPendingStatements(); } - // alter columns + // Alter columns. foreach (var alterColumn in command.TableCommands.OfType()) { var builder = new StringBuilder(); Visit(builder, alterColumn); RunPendingStatements(); } - // add index + // Add index. foreach (var addIndex in command.TableCommands.OfType()) { var builder = new StringBuilder(); Visit(builder, addIndex); RunPendingStatements(); } - // drop index + // Drop index. foreach (var dropIndex in command.TableCommands.OfType()) { var builder = new StringBuilder(); Visit(builder, dropIndex); RunPendingStatements(); } + // Add unique constraint. + foreach (var addUniqueConstraint in command.TableCommands.OfType()) { + var builder = new StringBuilder(); + Visit(builder, addUniqueConstraint); + RunPendingStatements(); + } + + // Drop unique constraint. + foreach (var dropUniqueConstraint in command.TableCommands.OfType()) { + var builder = new StringBuilder(); + Visit(builder, dropUniqueConstraint); + RunPendingStatements(); + } } public void Visit(StringBuilder builder, AddColumnCommand command) { @@ -210,7 +223,6 @@ namespace Orchard.Data.Migration.Interpreters { _sqlStatements.Add(builder.ToString()); } - public void Visit(StringBuilder builder, AddIndexCommand command) { if (ExecuteCustomInterpreter(command)) { return; @@ -235,6 +247,31 @@ namespace Orchard.Data.Migration.Interpreters { _sqlStatements.Add(builder.ToString()); } + public void Visit(StringBuilder builder, AddUniqueConstraintCommand command) { + if (ExecuteCustomInterpreter(command)) { + return; + } + + builder.AppendFormat("alter table {0} add constraint {1} unique ({2})", + _dialectLazy.Value.QuoteForTableName(PrefixTableName(command.TableName)), + _dialectLazy.Value.QuoteForColumnName(PrefixTableName(command.ConstraintName)), + String.Join(", ", command.ColumnNames)); + + _sqlStatements.Add(builder.ToString()); + } + + public void Visit(StringBuilder builder, DropUniqueConstraintCommand command) { + if (ExecuteCustomInterpreter(command)) { + return; + } + + builder.AppendFormat("alter table {0} drop constraint {1}", + _dialectLazy.Value.QuoteForTableName(PrefixTableName(command.TableName)), + _dialectLazy.Value.QuoteForColumnName(PrefixTableName(command.ConstraintName))); + + _sqlStatements.Add(builder.ToString()); + } + public override void Visit(SqlStatementCommand command) { if (command.Providers.Count != 0 && !command.Providers.Contains(_shellSettings.DataProvider)) { return; diff --git a/src/Orchard/Data/Migration/Schema/AddUniqueConstraintCommand.cs b/src/Orchard/Data/Migration/Schema/AddUniqueConstraintCommand.cs new file mode 100644 index 000000000..138a24294 --- /dev/null +++ b/src/Orchard/Data/Migration/Schema/AddUniqueConstraintCommand.cs @@ -0,0 +1,13 @@ +namespace Orchard.Data.Migration.Schema { + public class AddUniqueConstraintCommand : TableCommand { + public string ConstraintName { get; set; } + + public AddUniqueConstraintCommand(string tableName, string constraintName, params string[] columnNames) + : base(tableName) { + ColumnNames = columnNames; + ConstraintName = constraintName; + } + + public string[] ColumnNames { get; private set; } + } +} diff --git a/src/Orchard/Data/Migration/Schema/AlterTableCommand.cs b/src/Orchard/Data/Migration/Schema/AlterTableCommand.cs index 0b8d370e9..a843a0831 100644 --- a/src/Orchard/Data/Migration/Schema/AlterTableCommand.cs +++ b/src/Orchard/Data/Migration/Schema/AlterTableCommand.cs @@ -47,5 +47,15 @@ namespace Orchard.Data.Migration.Schema { var command = new DropIndexCommand(Name, indexName); TableCommands.Add(command); } + + public void CreateUniqueConstraint(string constraintName, params string[] columnNames) { + var command = new AddUniqueConstraintCommand(Name, constraintName, columnNames); + TableCommands.Add(command); + } + + public void DropUniqueConstraint(string constraintName) { + var command = new DropUniqueConstraintCommand(Name, constraintName); + TableCommands.Add(command); + } } } diff --git a/src/Orchard/Data/Migration/Schema/DropUniqueConstraintCommand.cs b/src/Orchard/Data/Migration/Schema/DropUniqueConstraintCommand.cs new file mode 100644 index 000000000..af8b5c3f3 --- /dev/null +++ b/src/Orchard/Data/Migration/Schema/DropUniqueConstraintCommand.cs @@ -0,0 +1,10 @@ +namespace Orchard.Data.Migration.Schema { + public class DropUniqueConstraintCommand : TableCommand { + public string ConstraintName { get; set; } + + public DropUniqueConstraintCommand(string tableName, string constraintName) + : base(tableName) { + ConstraintName = constraintName; + } + } +} diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj index 216323343..8bec83054 100644 --- a/src/Orchard/Orchard.Framework.csproj +++ b/src/Orchard/Orchard.Framework.csproj @@ -149,6 +149,8 @@ + +