From 3bc4efb45def6b4c7a4f7b32deaa039949d5e7e6 Mon Sep 17 00:00:00 2001 From: Shay Rojansky Date: Mon, 25 May 2020 16:15:48 +0200 Subject: [PATCH] Correct ordering of check constraint creation Fixes #21037 --- .../Migrations/Internal/MigrationsModelDiffer.cs | 11 ++++++----- .../MigrationsTestBase.cs | 16 ++++++++++++++++ .../MigrationsSqlServerTest.cs | 12 +++++++++++- 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/EFCore.Relational/Migrations/Internal/MigrationsModelDiffer.cs b/src/EFCore.Relational/Migrations/Internal/MigrationsModelDiffer.cs index bd1f82e1442..a528163f6e4 100644 --- a/src/EFCore.Relational/Migrations/Internal/MigrationsModelDiffer.cs +++ b/src/EFCore.Relational/Migrations/Internal/MigrationsModelDiffer.cs @@ -59,7 +59,12 @@ public class MigrationsModelDiffer : IMigrationsModelDiffer private static readonly Type[] _columnOperationTypes = { typeof(AddColumnOperation), typeof(AlterColumnOperation) }; - private static readonly Type[] _constraintOperationTypes = { typeof(AddForeignKeyOperation), typeof(CreateIndexOperation) }; + private static readonly Type[] _constraintOperationTypes = + { + typeof(AddForeignKeyOperation), + typeof(CreateIndexOperation), + typeof(CreateCheckConstraintOperation) + }; private IUpdateAdapter _sourceUpdateAdapter; private IUpdateAdapter _targetUpdateAdapter; @@ -212,10 +217,6 @@ protected virtual IReadOnlyList Sort( { createSequenceOperations.Add(operation); } - else if (type == typeof(CreateCheckConstraintOperation)) - { - createCheckConstraintOperations.Add(operation); - } else if (type == typeof(CreateTableOperation)) { createTableOperations.Add((CreateTableOperation)operation); diff --git a/test/EFCore.Relational.Specification.Tests/MigrationsTestBase.cs b/test/EFCore.Relational.Specification.Tests/MigrationsTestBase.cs index 6f7ed9b1339..cd88b754309 100644 --- a/test/EFCore.Relational.Specification.Tests/MigrationsTestBase.cs +++ b/test/EFCore.Relational.Specification.Tests/MigrationsTestBase.cs @@ -530,6 +530,22 @@ public virtual Task Add_column_shared() // Assert.Equal("nvarchar(30)", column.StoreType); }); + [ConditionalFact] + public virtual Task Add_column_with_check_constraint() + => Test( + builder => builder.Entity("People").Property("Id"), + builder => { }, + builder => builder.Entity( + "People", e => + { + e.Property("DriverLicense"); + e.HasCheckConstraint("CK_Foo", $"{DelimitIdentifier("DriverLicense")} > 0"); + }), + model => + { + // TODO: no scaffolding support for check constraints, https://github.com/aspnet/EntityFrameworkCore/issues/15408 + }); + [ConditionalFact] public virtual Task Alter_column_change_type() => Test( diff --git a/test/EFCore.SqlServer.FunctionalTests/MigrationsSqlServerTest.cs b/test/EFCore.SqlServer.FunctionalTests/MigrationsSqlServerTest.cs index 855d3b9606a..d5bbca968ac 100644 --- a/test/EFCore.SqlServer.FunctionalTests/MigrationsSqlServerTest.cs +++ b/test/EFCore.SqlServer.FunctionalTests/MigrationsSqlServerTest.cs @@ -28,7 +28,7 @@ public MigrationsSqlServerTest(MigrationsSqlServerFixture fixture, ITestOutputHe : base(fixture) { Fixture.TestSqlLoggerFactory.Clear(); - Fixture.TestSqlLoggerFactory.SetTestOutputHelper(testOutputHelper); + // Fixture.TestSqlLoggerFactory.SetTestOutputHelper(testOutputHelper); } public override async Task Create_table() @@ -414,6 +414,16 @@ public override async Task Add_column_shared() @"ALTER TABLE [Base] ADD [Foo] nvarchar(max) NULL;"); } + public override async Task Add_column_with_check_constraint() + { + await base.Add_column_with_check_constraint(); + + AssertSql( + @"ALTER TABLE [People] ADD [DriverLicense] int NOT NULL DEFAULT 0;", + // + @"ALTER TABLE [People] ADD CONSTRAINT [CK_Foo] CHECK ([DriverLicense] > 0);"); + } + [ConditionalFact] public virtual async Task Add_column_identity() {