From b86ebce87981b4d00c2742ed47f9f99d504176e6 Mon Sep 17 00:00:00 2001 From: Shay Rojansky Date: Thu, 19 Nov 2020 11:13:12 +0200 Subject: [PATCH 1/2] Fix collation scaffolding (#23388) Fixes #23386 (cherry picked from commit 92f9a2fe8faa6cffdd9d1646060a8cf6dba8c50e) --- .../RelationalScaffoldingModelFactory.cs | 7 ++- .../RelationalScaffoldingModelFactoryTest.cs | 44 +++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/EFCore.Design/Scaffolding/Internal/RelationalScaffoldingModelFactory.cs b/src/EFCore.Design/Scaffolding/Internal/RelationalScaffoldingModelFactory.cs index af451d31004..be28f80b28f 100644 --- a/src/EFCore.Design/Scaffolding/Internal/RelationalScaffoldingModelFactory.cs +++ b/src/EFCore.Design/Scaffolding/Internal/RelationalScaffoldingModelFactory.cs @@ -194,6 +194,11 @@ protected virtual ModelBuilder VisitDatabaseModel([NotNull] ModelBuilder modelBu modelBuilder.Model.SetDatabaseName(databaseModel.DatabaseName); } + if (!string.IsNullOrEmpty(databaseModel.Collation)) + { + modelBuilder.UseCollation(databaseModel.Collation); + } + VisitSequences(modelBuilder, databaseModel.Sequences); VisitTables(modelBuilder, databaseModel.Tables); VisitForeignKeys(modelBuilder, databaseModel.Tables.SelectMany(table => table.ForeignKeys).ToList()); @@ -497,7 +502,7 @@ protected virtual PropertyBuilder VisitColumn([NotNull] EntityTypeBuilder builde if (column.Collation != null) { - property.HasComment(column.Collation); + property.UseCollation(column.Collation); } if (!(column.Table.PrimaryKey?.Columns.Contains(column) ?? false)) diff --git a/test/EFCore.Design.Tests/Scaffolding/Internal/RelationalScaffoldingModelFactoryTest.cs b/test/EFCore.Design.Tests/Scaffolding/Internal/RelationalScaffoldingModelFactoryTest.cs index eb03e60bacb..d9ef9744d46 100644 --- a/test/EFCore.Design.Tests/Scaffolding/Internal/RelationalScaffoldingModelFactoryTest.cs +++ b/test/EFCore.Design.Tests/Scaffolding/Internal/RelationalScaffoldingModelFactoryTest.cs @@ -1995,6 +1995,50 @@ public void Column_and_table_comments() Assert.Equal("An int column", column.GetComment()); } + [ConditionalFact] + public void Database_collation() + { + var database = new DatabaseModel + { + Collation = "SomeDatabaseCollation" + }; + + var model = _factory.Create(database, new ModelReverseEngineerOptions()); + Assert.Equal("SomeDatabaseCollation", model.GetCollation()); + } + + [ConditionalFact] + public void Column_collation() + { + var database = new DatabaseModel + { + Tables = + { + new DatabaseTable + { + Database = Database, + Name = "Table", + Columns = + { + IdColumn, + new DatabaseColumn + { + Table = Table, + Name = "Column", + StoreType = "int", + Collation = "SomeColumnCollation" + } + } + } + } + }; + + var model = _factory.Create(database, new ModelReverseEngineerOptions()); + + var column = model.FindEntityType("Table").GetProperty("Column"); + Assert.Equal("SomeColumnCollation", column.GetCollation()); + } + [ConditionalTheory] [InlineData(false, false, false)] [InlineData(false, false, true)] From 240223ef37a9bb44688f93ebab203c2c8f3c3e95 Mon Sep 17 00:00:00 2001 From: Shay Rojansky Date: Fri, 20 Nov 2020 15:00:21 +0200 Subject: [PATCH 2/2] Quirk for #23386 --- .../Internal/RelationalScaffoldingModelFactory.cs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/EFCore.Design/Scaffolding/Internal/RelationalScaffoldingModelFactory.cs b/src/EFCore.Design/Scaffolding/Internal/RelationalScaffoldingModelFactory.cs index be28f80b28f..f8f8926dc35 100644 --- a/src/EFCore.Design/Scaffolding/Internal/RelationalScaffoldingModelFactory.cs +++ b/src/EFCore.Design/Scaffolding/Internal/RelationalScaffoldingModelFactory.cs @@ -29,6 +29,9 @@ namespace Microsoft.EntityFrameworkCore.Scaffolding.Internal /// public class RelationalScaffoldingModelFactory : IScaffoldingModelFactory { + private static readonly bool _useOldBehavior + = AppContext.TryGetSwitch("Microsoft.EntityFrameworkCore.Issue23386", out var enabled) && enabled; + internal const string NavigationNameUniquifyingPattern = "{0}Navigation"; internal const string SelfReferencingPrincipalEndNavigationNamePattern = "Inverse{0}"; @@ -194,7 +197,7 @@ protected virtual ModelBuilder VisitDatabaseModel([NotNull] ModelBuilder modelBu modelBuilder.Model.SetDatabaseName(databaseModel.DatabaseName); } - if (!string.IsNullOrEmpty(databaseModel.Collation)) + if (!_useOldBehavior && !string.IsNullOrEmpty(databaseModel.Collation)) { modelBuilder.UseCollation(databaseModel.Collation); } @@ -502,7 +505,14 @@ protected virtual PropertyBuilder VisitColumn([NotNull] EntityTypeBuilder builde if (column.Collation != null) { - property.UseCollation(column.Collation); + if (_useOldBehavior) + { + property.HasComment(column.Collation); + } + else + { + property.UseCollation(column.Collation); + } } if (!(column.Table.PrimaryKey?.Columns.Contains(column) ?? false))