Skip to content

Commit 514feb2

Browse files
committed
Bug fix - Non-pascal casing could leave hanging symbol. Thanks to Bryan Tichy.
1 parent 0b924c0 commit 514feb2

File tree

31 files changed

+12208
-43
lines changed

31 files changed

+12208
-43
lines changed

EntityFramework.Reverse.POCO.Generator/EF.Reverse.POCO.v3.ttinclude

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3056,7 +3056,7 @@
30563056

30573057
public string PkTableHumanCase(string suffix)
30583058
{
3059-
var singular = Inflector.MakeSingular(PkTableNameFiltered);
3059+
var singular = Inflector.MakeSingular(DatabaseReader.CleanUp(PkTableNameFiltered));
30603060

30613061
var pkTableHumanCase = (Settings.UsePascalCase ? Inflector.ToTitleCase(singular) : singular)
30623062
.Replace(" ", string.Empty)
@@ -3204,6 +3204,7 @@
32043204
var fkName = (Settings.UsePascalCase ? Inflector.ToTitleCase(foreignKey.FkColumn) : foreignKey.FkColumn).Replace(" ", string.Empty).Replace("$", string.Empty);
32053205
var name = Settings.ForeignKeyName(tableNameHumanCase, foreignKey, fkName, relationship, 1);
32063206
string col;
3207+
32073208
if (!ReverseNavigationUniquePropName.Contains(name) &&
32083209
!ReverseNavigationUniquePropNameClashes.Contains(name))
32093210
{
@@ -4422,8 +4423,8 @@
44224423
}
44234424

44244425
// Handle table names with underscores - singularise just the last word
4425-
var tableName = filter.TableRename(tn.TableName, tn.SchemaName, tn.IsView);
4426-
var singularCleanTableName = Inflector.MakeSingular(DatabaseReader.CleanUp(tableName));
4426+
var tableName = DatabaseReader.CleanUp(filter.TableRename(tn.TableName, tn.SchemaName, tn.IsView));
4427+
var singularCleanTableName = Inflector.MakeSingular(tableName);
44274428
table.NameHumanCase = (Settings.UsePascalCase ? Inflector.ToTitleCase(singularCleanTableName) : singularCleanTableName).Replace(" ", "").Replace("$", "").Replace(".", "");
44284429

44294430
if (Settings.PrependSchemaName && string.Compare(table.Schema.DbName, Settings.DefaultSchema, StringComparison.OrdinalIgnoreCase) != 0)
@@ -12943,7 +12944,7 @@ and limitations under the License.
1294312944
if (string.IsNullOrEmpty(name))
1294412945
continue;
1294512946

12946-
name = RemoveNonAlphanumerics.Replace(name, string.Empty);
12947+
name = RemoveNonAlphaNumeric.Replace(name, string.Empty);
1294712948
name = (Settings.UsePascalCaseForEnumMembers ? Inflector.ToTitleCase(name) : name).Replace(" ", string.Empty).Trim();
1294812949
if (string.IsNullOrEmpty(name))
1294912950
continue;
@@ -13149,14 +13150,20 @@ and limitations under the License.
1314913150
return col;
1315013151
}
1315113152

13152-
private static readonly Regex RemoveNonAlphanumerics = new Regex(@"[^\w\d\s_-]", RegexOptions.Compiled);
13153+
private static readonly Regex RemoveNonAlphaNumeric = new Regex(@"[^\w\d\s_-]", RegexOptions.Compiled);
13154+
private static readonly Regex RemoveTrailingSymbols = new Regex(@"[$-/:-?{-~!""^_`\[\]]+$", RegexOptions.Compiled);
1315313155

1315413156
public static readonly Func<string, string> CleanUp = (str) =>
1315513157
{
1315613158
// Replace punctuation and symbols in variable names as these are not allowed.
13159+
if(string.IsNullOrEmpty(str))
13160+
return string.Empty;
13161+
13162+
if(str.Any(char.IsLetterOrDigit))
13163+
str = RemoveTrailingSymbols.Replace(str.Replace('-', '_'), string.Empty);
1315713164
var len = str.Length;
1315813165
if (len == 0)
13159-
return str;
13166+
return string.Empty;
1316013167

1316113168
var sb = new StringBuilder(len + 20);
1316213169
var replacedCharacter = false;
@@ -13175,7 +13182,7 @@ and limitations under the License.
1317513182
if (replacedCharacter)
1317613183
str = sb.ToString();
1317713184

13178-
str = RemoveNonAlphanumerics.Replace(str, string.Empty);
13185+
str = RemoveNonAlphaNumeric.Replace(str, string.Empty);
1317913186
if (char.IsDigit(str[0]))
1318013187
str = "C" + str;
1318113188

Generator.Tests.Integration/Generator.Tests.Integration.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,9 @@
105105
<Compile Include="SingleDatabaseTestPostgreSql.cs" />
106106
<Compile Include="SingleDatabaseTestSqlCeServer.cs" />
107107
<Compile Include="SingleDatabaseTestSqlServer.cs" />
108+
<None Include="TestComparison\NonPascalCased_SqlServer_EfCore6_FkLegacy.cs">
109+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
110+
</None>
108111
<None Include="TestComparison\PostgisTest_PostgreSQL_EfCore3_FkLegacy.cs">
109112
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
110113
</None>

Generator.Tests.Integration/SingleDatabaseTestBase.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ protected static void SetupDatabase(
3333
Settings.PrependSchemaName = true;
3434
Settings.DisableGeographyTypes = false;
3535
Settings.AddUnitTestingDbContext = true;
36+
Settings.UsePascalCase = true;
3637

3738
ResetFilters();
3839
}

Generator.Tests.Integration/SingleDatabaseTestSqlServer.cs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@ public void SetupSqlServer(
4242
public void ReverseEngineerSqlServer(string database, string singleDbContextSubNamespace, string connectionStringName, string dbContextName, TemplateType templateType, ForeignKeyNamingStrategy foreignKeyNamingStrategy)
4343
{
4444
// Arrange
45+
SetupSqlServer(database, connectionStringName, dbContextName, templateType, templateType == TemplateType.Ef6 ? GeneratorType.Ef6 : GeneratorType.EfCore, foreignKeyNamingStrategy);
4546
Settings.GenerateSeparateFiles = false;
4647
Settings.UseMappingTables = (templateType != TemplateType.EfCore2 && templateType != TemplateType.EfCore3);
47-
SetupSqlServer(database, connectionStringName, dbContextName, templateType, templateType == TemplateType.Ef6 ? GeneratorType.Ef6 : GeneratorType.EfCore, foreignKeyNamingStrategy);
4848
if(templateType == TemplateType.EfCore5) // Don't do all, as we want a mix of true/false for this field.
4949
Settings.TrimCharFields = true;
5050
else
@@ -86,6 +86,22 @@ public void ReverseEngineerSqlServer(string database, string singleDbContextSubN
8686
// Assert
8787
CompareAgainstTestComparison(database);
8888
}
89+
90+
[Test]
91+
public void NonPascalCased()
92+
{
93+
// Arrange
94+
SetupSqlServer("EfrpgTest", "My_db_context", "Efrpg_db_context", TemplateType.EfCore6, GeneratorType.EfCore, ForeignKeyNamingStrategy.Legacy);
95+
Settings.GenerateSeparateFiles = false;
96+
Settings.UsePascalCase = false;
97+
98+
// Act
99+
const string filename = "NonPascalCased";
100+
Run(filename, ".V4TestE6", typeof(NullFileManager), null);
101+
102+
// Assert
103+
CompareAgainstTestComparison(filename);
104+
}
89105

90106
[Test]
91107
[TestCase("EfrpgTest", ".V3FilterTest", "EfrpgTest", "EfrpgDbContext", false, TemplateType.EfCore3, ForeignKeyNamingStrategy.Legacy)]
@@ -94,9 +110,9 @@ public void ReverseEngineerSqlServer(string database, string singleDbContextSubN
94110
public void MultipleIncludeFilters(string database, string singleDbContextSubNamespace, string connectionStringName, string dbContextName, bool publicTestComparison, TemplateType templateType, ForeignKeyNamingStrategy foreignKeyNamingStrategy)
95111
{
96112
// Arrange
113+
SetupSqlServer(database, connectionStringName, dbContextName, templateType, templateType == TemplateType.Ef6 ? GeneratorType.Ef6 : GeneratorType.EfCore, foreignKeyNamingStrategy);
97114
Settings.GenerateSeparateFiles = false;
98115
Settings.UseMappingTables = (templateType != TemplateType.EfCore2 && templateType != TemplateType.EfCore3);
99-
SetupSqlServer(database, connectionStringName, dbContextName, templateType, templateType == TemplateType.Ef6 ? GeneratorType.Ef6 : GeneratorType.EfCore, foreignKeyNamingStrategy);
100116
Settings.AddUnitTestingDbContext = false;
101117

102118
FilterSettings.SchemaFilters.Add(new RegexIncludeFilter("dbo.*"));

Generator.Tests.Integration/TestComparison/EfrpgTest_SqlServer_Ef6_FkLegacy.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3887,7 +3887,7 @@ public class ColumnNameAndType
38873887
public int C36 { get; set; } // $ (Primary key)
38883888
public int? C37 { get; set; } // %
38893889
public int? C163 { get; set; } // £
3890-
public int? C38Fred36 { get; set; } // &fred$
3890+
public int? C38Fred { get; set; } // &fred$
38913891
public int? Abc4792 { get; set; } // abc/\
38923892
public int? Joe46Bloggs { get; set; } // joe.bloggs
38933893
public int? SimonHughes { get; set; } // simon-hughes
@@ -5607,7 +5607,7 @@ public ColumnNameAndTypeConfiguration(string schema)
56075607
Property(x => x.C36).HasColumnName(@"$").HasColumnType("int").IsRequired().HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
56085608
Property(x => x.C37).HasColumnName(@"%").HasColumnType("int").IsOptional();
56095609
Property(x => x.C163).HasColumnName(@"£").HasColumnType("int").IsOptional();
5610-
Property(x => x.C38Fred36).HasColumnName(@"&fred$").HasColumnType("int").IsOptional();
5610+
Property(x => x.C38Fred).HasColumnName(@"&fred$").HasColumnType("int").IsOptional();
56115611
Property(x => x.Abc4792).HasColumnName(@"abc/\").HasColumnType("int").IsOptional();
56125612
Property(x => x.Joe46Bloggs).HasColumnName(@"joe.bloggs").HasColumnType("int").IsOptional();
56135613
Property(x => x.SimonHughes).HasColumnName(@"simon-hughes").HasColumnType("int").IsOptional();

Generator.Tests.Integration/TestComparison/EfrpgTest_SqlServer_EfCore2_FkLegacy.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3782,7 +3782,7 @@ public class ColumnNameAndType
37823782
public int C36 { get; set; } // $ (Primary key)
37833783
public int? C37 { get; set; } // %
37843784
public int? C163 { get; set; } // £
3785-
public int? C38Fred36 { get; set; } // &fred$
3785+
public int? C38Fred { get; set; } // &fred$
37863786
public int? Abc4792 { get; set; } // abc/\
37873787
public int? Joe46Bloggs { get; set; } // joe.bloggs
37883788
public int? SimonHughes { get; set; } // simon-hughes
@@ -5485,7 +5485,7 @@ public void Configure(EntityTypeBuilder<ColumnNameAndType> builder)
54855485
builder.Property(x => x.C36).HasColumnName(@"$").HasColumnType("int").IsRequired().ValueGeneratedNever();
54865486
builder.Property(x => x.C37).HasColumnName(@"%").HasColumnType("int").IsRequired(false);
54875487
builder.Property(x => x.C163).HasColumnName(@"£").HasColumnType("int").IsRequired(false);
5488-
builder.Property(x => x.C38Fred36).HasColumnName(@"&fred$").HasColumnType("int").IsRequired(false);
5488+
builder.Property(x => x.C38Fred).HasColumnName(@"&fred$").HasColumnType("int").IsRequired(false);
54895489
builder.Property(x => x.Abc4792).HasColumnName(@"abc/\").HasColumnType("int").IsRequired(false);
54905490
builder.Property(x => x.Joe46Bloggs).HasColumnName(@"joe.bloggs").HasColumnType("int").IsRequired(false);
54915491
builder.Property(x => x.SimonHughes).HasColumnName(@"simon-hughes").HasColumnType("int").IsRequired(false);

Generator.Tests.Integration/TestComparison/EfrpgTest_SqlServer_EfCore3_FkLegacy.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3865,7 +3865,7 @@ public class ColumnNameAndType
38653865
public int C36 { get; set; } // $ (Primary key)
38663866
public int? C37 { get; set; } // %
38673867
public int? C163 { get; set; } // £
3868-
public int? C38Fred36 { get; set; } // &fred$
3868+
public int? C38Fred { get; set; } // &fred$
38693869
public int? Abc4792 { get; set; } // abc/\
38703870
public int? Joe46Bloggs { get; set; } // joe.bloggs
38713871
public int? SimonHughes { get; set; } // simon-hughes
@@ -5579,7 +5579,7 @@ public void Configure(EntityTypeBuilder<ColumnNameAndType> builder)
55795579
builder.Property(x => x.C36).HasColumnName(@"$").HasColumnType("int").IsRequired().ValueGeneratedNever();
55805580
builder.Property(x => x.C37).HasColumnName(@"%").HasColumnType("int").IsRequired(false);
55815581
builder.Property(x => x.C163).HasColumnName(@"£").HasColumnType("int").IsRequired(false);
5582-
builder.Property(x => x.C38Fred36).HasColumnName(@"&fred$").HasColumnType("int").IsRequired(false);
5582+
builder.Property(x => x.C38Fred).HasColumnName(@"&fred$").HasColumnType("int").IsRequired(false);
55835583
builder.Property(x => x.Abc4792).HasColumnName(@"abc/\").HasColumnType("int").IsRequired(false);
55845584
builder.Property(x => x.Joe46Bloggs).HasColumnName(@"joe.bloggs").HasColumnType("int").IsRequired(false);
55855585
builder.Property(x => x.SimonHughes).HasColumnName(@"simon-hughes").HasColumnType("int").IsRequired(false);

Generator.Tests.Integration/TestComparison/EfrpgTest_SqlServer_EfCore5_FkLegacy.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3770,7 +3770,7 @@ public class ColumnNameAndType
37703770
public int C36 { get; set; } // $ (Primary key)
37713771
public int? C37 { get; set; } // %
37723772
public int? C163 { get; set; } // £
3773-
public int? C38Fred36 { get; set; } // &fred$
3773+
public int? C38Fred { get; set; } // &fred$
37743774
public int? Abc4792 { get; set; } // abc/\
37753775
public int? Joe46Bloggs { get; set; } // joe.bloggs
37763776
public int? SimonHughes { get; set; } // simon-hughes
@@ -5378,7 +5378,7 @@ public void Configure(EntityTypeBuilder<ColumnNameAndType> builder)
53785378
builder.Property(x => x.C36).HasColumnName(@"$").HasColumnType("int").IsRequired().ValueGeneratedNever();
53795379
builder.Property(x => x.C37).HasColumnName(@"%").HasColumnType("int").IsRequired(false);
53805380
builder.Property(x => x.C163).HasColumnName(@"£").HasColumnType("int").IsRequired(false);
5381-
builder.Property(x => x.C38Fred36).HasColumnName(@"&fred$").HasColumnType("int").IsRequired(false);
5381+
builder.Property(x => x.C38Fred).HasColumnName(@"&fred$").HasColumnType("int").IsRequired(false);
53825382
builder.Property(x => x.Abc4792).HasColumnName(@"abc/\").HasColumnType("int").IsRequired(false);
53835383
builder.Property(x => x.Joe46Bloggs).HasColumnName(@"joe.bloggs").HasColumnType("int").IsRequired(false);
53845384
builder.Property(x => x.SimonHughes).HasColumnName(@"simon-hughes").HasColumnType("int").IsRequired(false);

Generator.Tests.Integration/TestComparison/EfrpgTest_SqlServer_EfCore6_FkLegacy.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3764,7 +3764,7 @@ public class ColumnNameAndType
37643764
public int C36 { get; set; } // $ (Primary key)
37653765
public int? C37 { get; set; } // %
37663766
public int? C163 { get; set; } // £
3767-
public int? C38Fred36 { get; set; } // &fred$
3767+
public int? C38Fred { get; set; } // &fred$
37683768
public int? Abc4792 { get; set; } // abc/\
37693769
public int? Joe46Bloggs { get; set; } // joe.bloggs
37703770
public int? SimonHughes { get; set; } // simon-hughes
@@ -5372,7 +5372,7 @@ public void Configure(EntityTypeBuilder<ColumnNameAndType> builder)
53725372
builder.Property(x => x.C36).HasColumnName(@"$").HasColumnType("int").IsRequired().ValueGeneratedNever();
53735373
builder.Property(x => x.C37).HasColumnName(@"%").HasColumnType("int").IsRequired(false);
53745374
builder.Property(x => x.C163).HasColumnName(@"£").HasColumnType("int").IsRequired(false);
5375-
builder.Property(x => x.C38Fred36).HasColumnName(@"&fred$").HasColumnType("int").IsRequired(false);
5375+
builder.Property(x => x.C38Fred).HasColumnName(@"&fred$").HasColumnType("int").IsRequired(false);
53765376
builder.Property(x => x.Abc4792).HasColumnName(@"abc/\").HasColumnType("int").IsRequired(false);
53775377
builder.Property(x => x.Joe46Bloggs).HasColumnName(@"joe.bloggs").HasColumnType("int").IsRequired(false);
53785378
builder.Property(x => x.SimonHughes).HasColumnName(@"simon-hughes").HasColumnType("int").IsRequired(false);

0 commit comments

Comments
 (0)