diff --git a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/TableDesignerValidator.cs b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/TableDesignerValidator.cs index 09d89091..d72bfa52 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/TableDesignerValidator.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/TableDesigner/TableDesignerValidator.cs @@ -30,7 +30,8 @@ namespace Microsoft.SqlTools.ServiceLayer.TableDesigner new TemporalTableMustHavePrimaryKeyRule(), new TableMustHaveAtLeastOneColumnRule(), new MemoryOptimizedTableIdentityColumnRule(), - new TableShouldAvoidHavingMultipleEdgeConstraintsRule() + new TableShouldAvoidHavingMultipleEdgeConstraintsRule(), + new ColumnCannotBeListedMoreThanOnceInPrimaryKeyRule() }; /// @@ -523,4 +524,34 @@ namespace Microsoft.SqlTools.ServiceLayer.TableDesigner return errors; } } + + public class ColumnCannotBeListedMoreThanOnceInPrimaryKeyRule : ITableDesignerValidationRule + { + public List Run(Dac.TableDesigner designer) + { + var table = designer.TableViewModel; + var errors = new List(); + if (table.PrimaryKey != null) + { + var existingNames = new HashSet(); + for (int i = 0; i < table.PrimaryKey.Columns.Count; i++) + { + var columnSpec = table.PrimaryKey.Columns[i]; + if (existingNames.Contains(columnSpec.Column)) + { + errors.Add(new TableDesignerIssue() + { + Description = string.Format("Cannot use duplicate column names in primary key, column name: {0}", columnSpec.Column), + PropertyPath = new object[] { TablePropertyNames.PrimaryKeyColumns, i, IndexColumnSpecificationPropertyNames.Column } + }); + } + else + { + existingNames.Add(columnSpec.Column); + } + } + } + return errors; + } + } } \ No newline at end of file