Skip to content

Commit 2b65b77

Browse files
authored
Merge pull request #205 from TrackableEntities/fix-has-key-omission
[Fix] HasKey Reference Left Out with Non-Conventional Key Property
2 parents 0529b73 + dd6a0a3 commit 2b65b77

File tree

10 files changed

+179
-13
lines changed

10 files changed

+179
-13
lines changed

src/EntityFrameworkCore.Scaffolding.Handlebars/EntityFrameworkCore.Scaffolding.Handlebars.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<PropertyGroup>
44
<TargetFramework>net6.0</TargetFramework>
55
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
6-
<Version>6.0.2</Version>
6+
<Version>6.0.3</Version>
77
<Authors>Tony Sneed</Authors>
88
<Company>Tony Sneed</Company>
99
<Title>Entity Framework Core Scaffolding with Handlebars</Title>
@@ -12,7 +12,7 @@
1212
<PackageProjectUrl>https://github.com/TrackableEntities/EntityFrameworkCore.Scaffolding.Handlebars</PackageProjectUrl>
1313
<PackageIcon>icon.png</PackageIcon>
1414
<PackageTags>scaffolding reverse-engineer entity-framework-core handlebars</PackageTags>
15-
<PackageReleaseNotes>See: https://github.com/TrackableEntities/EntityFrameworkCore.Scaffolding.Handlebars/releases/tag/v6.0.2</PackageReleaseNotes>
15+
<PackageReleaseNotes>See: https://github.com/TrackableEntities/EntityFrameworkCore.Scaffolding.Handlebars/releases/tag/v6.0.3</PackageReleaseNotes>
1616
<LangVersion>latest</LangVersion>
1717
<IncludeSource>true</IncludeSource>
1818
<SignAssembly>true</SignAssembly>

src/EntityFrameworkCore.Scaffolding.Handlebars/HbsCSharpDbContextGenerator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -506,7 +506,7 @@ private void GenerateKey(IKey key, IEntityType entityType, IndentedStringBuilder
506506
KeyDiscoveryConvention.DiscoverKeyProperties(
507507
concreteKey.DeclaringEntityType,
508508
concreteKey.DeclaringEntityType.GetProperties()))
509-
&& UseDataAnnotations || !propertyNameOverriden)
509+
&& !propertyNameOverriden)
510510
{
511511
return;
512512
}

test/Scaffolding.Handlebars.Tests/Contexts/NorthwindDbContext.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,18 @@ public NorthwindDbContext(DbContextOptions options) : base(options) { }
1111

1212
public DbSet<Category> Categories { get; set; }
1313
public DbSet<Product> Products { get; set; }
14+
public DbSet<Customer> Customers { get; set; }
1415

1516
protected override void OnModelCreating(ModelBuilder modelBuilder)
1617
{
1718
modelBuilder.Entity<Category>()
1819
.HasComment("A category of products")
1920
.Property(category => category.CategoryName)
2021
.HasComment("The name of a category");
22+
modelBuilder.Entity<Customer>(entity =>
23+
{
24+
entity.Property(e => e.CustomerKey).IsFixedLength();
25+
});
2126
}
2227
}
2328
}

test/Scaffolding.Handlebars.Tests/ExpectedContexts.cs

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ namespace FakeNamespace
1616
public partial class FakeDbContext : DbContext
1717
{
1818
public virtual DbSet<Category> Categories { get; set; }
19+
public virtual DbSet<Customer> Customers { get; set; }
1920
public virtual DbSet<Product> Products { get; set; }
2021
2122
public FakeDbContext(DbContextOptions<FakeDbContext> options) : base(options)
@@ -45,6 +46,27 @@ protected override void OnModelCreating(ModelBuilder modelBuilder)
4546
.HasComment(""The name of a category"");
4647
});
4748
49+
modelBuilder.Entity<Customer>(entity =>
50+
{
51+
entity.HasKey(e => e.CustomerKey);
52+
53+
entity.ToTable(""Customer"");
54+
55+
entity.Property(e => e.CustomerKey)
56+
.HasMaxLength(5)
57+
.IsFixedLength();
58+
59+
entity.Property(e => e.City).HasMaxLength(15);
60+
61+
entity.Property(e => e.CompanyName)
62+
.IsRequired()
63+
.HasMaxLength(40);
64+
65+
entity.Property(e => e.ContactName).HasMaxLength(30);
66+
67+
entity.Property(e => e.Country).HasMaxLength(15);
68+
});
69+
4870
modelBuilder.Entity<Product>(entity =>
4971
{
5072
entity.ToTable(""Product"");
@@ -87,6 +109,7 @@ namespace FakeNamespace
87109
public partial class FakeDbContext : DbContext
88110
{
89111
public virtual DbSet<CategoryRenamed> Category { get; set; }
112+
public virtual DbSet<CustomerRenamed> Customer { get; set; }
90113
public virtual DbSet<ProductRenamed> Product { get; set; }
91114
92115
public FakeDbContext(DbContextOptions<FakeDbContext> options) : base(options)
@@ -121,6 +144,27 @@ protected override void OnModelCreating(ModelBuilder modelBuilder)
121144
.HasComment(""The name of a category"");
122145
});
123146
147+
modelBuilder.Entity<CustomerRenamed>(entity =>
148+
{
149+
entity.HasKey(e => e.CustomerKey);
150+
151+
entity.ToTable(""Customer"");
152+
153+
entity.Property(e => e.CustomerKey)
154+
.HasMaxLength(5)
155+
.IsFixedLength();
156+
157+
entity.Property(e => e.City).HasMaxLength(15);
158+
159+
entity.Property(e => e.CompanyName)
160+
.IsRequired()
161+
.HasMaxLength(40);
162+
163+
entity.Property(e => e.ContactName).HasMaxLength(30);
164+
165+
entity.Property(e => e.Country).HasMaxLength(15);
166+
});
167+
124168
modelBuilder.Entity<ProductRenamed>(entity =>
125169
{
126170
entity.HasKey(e => e.ProductIdRenamed);
@@ -171,6 +215,7 @@ namespace FakeNamespace
171215
public partial class FakeDbContext : DbContext
172216
{
173217
public virtual DbSet<Category> Categories { get; set; }
218+
public virtual DbSet<Customer> Customers { get; set; }
174219
public virtual DbSet<Product> Products { get; set; }
175220
176221
public FakeDbContext(DbContextOptions<FakeDbContext> options) : base(options)
@@ -191,6 +236,27 @@ protected override void OnModelCreating(ModelBuilder modelBuilder)
191236
.HasComment(""The name of a category"");
192237
});
193238
239+
modelBuilder.Entity<Customer>(entity =>
240+
{
241+
entity.HasKey(e => e.CustomerKey);
242+
243+
entity.ToTable(""Customer"");
244+
245+
entity.Property(e => e.CustomerKey)
246+
.HasMaxLength(5)
247+
.IsFixedLength();
248+
249+
entity.Property(e => e.City).HasMaxLength(15);
250+
251+
entity.Property(e => e.CompanyName)
252+
.IsRequired()
253+
.HasMaxLength(40);
254+
255+
entity.Property(e => e.ContactName).HasMaxLength(30);
256+
257+
entity.Property(e => e.Country).HasMaxLength(15);
258+
});
259+
194260
modelBuilder.Entity<Product>(entity =>
195261
{
196262
entity.ToTable(""Product"");
@@ -233,6 +299,7 @@ namespace FakeNamespace
233299
public partial class FakeDbContext : DbContext
234300
{
235301
public virtual DbSet<CategoryRenamed> Category { get; set; }
302+
public virtual DbSet<CustomerRenamed> Customer { get; set; }
236303
public virtual DbSet<ProductRenamed> Product { get; set; }
237304
238305
public FakeDbContext(DbContextOptions<FakeDbContext> options) : base(options)
@@ -258,6 +325,27 @@ protected override void OnModelCreating(ModelBuilder modelBuilder)
258325
.HasComment(""The name of a category"");
259326
});
260327
328+
modelBuilder.Entity<CustomerRenamed>(entity =>
329+
{
330+
entity.HasKey(e => e.CustomerKey);
331+
332+
entity.ToTable(""Customer"");
333+
334+
entity.Property(e => e.CustomerKey)
335+
.HasMaxLength(5)
336+
.IsFixedLength();
337+
338+
entity.Property(e => e.City).HasMaxLength(15);
339+
340+
entity.Property(e => e.CompanyName)
341+
.IsRequired()
342+
.HasMaxLength(40);
343+
344+
entity.Property(e => e.ContactName).HasMaxLength(30);
345+
346+
entity.Property(e => e.Country).HasMaxLength(15);
347+
});
348+
261349
modelBuilder.Entity<ProductRenamed>(entity =>
262350
{
263351
entity.HasKey(e => e.ProductIdRenamed);
@@ -308,6 +396,7 @@ namespace FakeNamespace
308396
public partial class FakeDbContext : DbContext
309397
{
310398
public virtual DbSet<Category> Categories { get; set; }
399+
public virtual DbSet<Customer> Customers { get; set; }
311400
public virtual DbSet<Product> Products { get; set; }
312401
313402
public FakeDbContext(DbContextOptions<FakeDbContext> options) : base(options)
@@ -332,6 +421,11 @@ protected override void OnModelCreating(ModelBuilder modelBuilder)
332421
entity.Property(e => e.CategoryName).HasComment(""The name of a category"");
333422
});
334423
424+
modelBuilder.Entity<Customer>(entity =>
425+
{
426+
entity.Property(e => e.CustomerKey).IsFixedLength();
427+
});
428+
335429
modelBuilder.Entity<Product>(entity =>
336430
{
337431
entity.Property(e => e.RowVersion)
@@ -360,6 +454,7 @@ namespace FakeNamespace
360454
public partial class FakeDbContext : DbContext
361455
{
362456
public virtual DbSet<CategoryRenamed> Category { get; set; }
457+
public virtual DbSet<CustomerRenamed> Customer { get; set; }
363458
public virtual DbSet<ProductRenamed> Product { get; set; }
364459
365460
public FakeDbContext(DbContextOptions<FakeDbContext> options) : base(options)
@@ -384,6 +479,11 @@ protected override void OnModelCreating(ModelBuilder modelBuilder)
384479
entity.Property(e => e.CategoryNameRenamed).HasComment(""The name of a category"");
385480
});
386481
482+
modelBuilder.Entity<CustomerRenamed>(entity =>
483+
{
484+
entity.Property(e => e.CustomerKey).IsFixedLength();
485+
});
486+
387487
modelBuilder.Entity<ProductRenamed>(entity =>
388488
{
389489
entity.Property(e => e.RowVersion)

test/Scaffolding.Handlebars.Tests/ExpectedTypeScriptContexts.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ namespace FakeNamespace
1616
public partial class FakeDbContext : DbContext
1717
{
1818
public virtual DbSet<Category> Categories { get; set; }
19+
public virtual DbSet<Customer> Customers { get; set; }
1920
public virtual DbSet<Product> Products { get; set; }
2021
2122
public FakeDbContext(DbContextOptions<FakeDbContext> options) : base(options)
@@ -45,6 +46,27 @@ protected override void OnModelCreating(ModelBuilder modelBuilder)
4546
.HasComment(""The name of a category"");
4647
});
4748
49+
modelBuilder.Entity<Customer>(entity =>
50+
{
51+
entity.HasKey(e => e.CustomerKey);
52+
53+
entity.ToTable(""Customer"");
54+
55+
entity.Property(e => e.CustomerKey)
56+
.HasMaxLength(5)
57+
.IsFixedLength();
58+
59+
entity.Property(e => e.City).HasMaxLength(15);
60+
61+
entity.Property(e => e.CompanyName)
62+
.IsRequired()
63+
.HasMaxLength(40);
64+
65+
entity.Property(e => e.ContactName).HasMaxLength(30);
66+
67+
entity.Property(e => e.Country).HasMaxLength(15);
68+
});
69+
4870
modelBuilder.Entity<Product>(entity =>
4971
{
5072
entity.ToTable(""Product"");

test/Scaffolding.Handlebars.Tests/HbsCSharpScaffoldingGeneratorTests.cs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -526,9 +526,11 @@ public void Save_Should_Write_Entity_Files()
526526
// Assert
527527
var expectedContextPath = Path.Combine(directory.Path, "Contexts", Constants.Files.CSharpFiles.DbContextFile);
528528
var expectedCategoryPath = Path.Combine(directory.Path, "Models", Constants.Files.CSharpFiles.CategoryFile);
529+
var expectedCustomerPath = Path.Combine(directory.Path, "Models", Constants.Files.CSharpFiles.CustomerFile);
529530
var expectedProductPath = Path.Combine(directory.Path, "Models", Constants.Files.CSharpFiles.ProductFile);
530531
Assert.Equal(expectedCategoryPath, result.AdditionalFiles[0]);
531-
Assert.Equal(expectedProductPath, result.AdditionalFiles[1]);
532+
Assert.Equal(expectedCustomerPath, result.AdditionalFiles[1]);
533+
Assert.Equal(expectedProductPath, result.AdditionalFiles[2]);
532534
Assert.False(File.Exists(expectedContextPath));
533535
}
534536

@@ -561,10 +563,12 @@ public void Save_Should_Write_Context_and_Entity_Files_With_Prefix()
561563
// Assert
562564
var expectedContextPath = Path.Combine(directory.Path, "Contexts", $"{filenamePrefix}{Constants.Files.CSharpFiles.DbContextFile}");
563565
var expectedCategoryPath = Path.Combine(directory.Path, "Models", $"{filenamePrefix}{Constants.Files.CSharpFiles.CategoryFile}");
566+
var expectedCustomerPath = Path.Combine(directory.Path, "Models", $"{filenamePrefix}{Constants.Files.CSharpFiles.CustomerFile}");
564567
var expectedProductPath = Path.Combine(directory.Path, "Models", $"{filenamePrefix}{ Constants.Files.CSharpFiles.ProductFile}");
565568
Assert.Equal(expectedContextPath, result.ContextFile);
566569
Assert.Equal(expectedCategoryPath, result.AdditionalFiles[0]);
567-
Assert.Equal(expectedProductPath, result.AdditionalFiles[1]);
570+
Assert.Equal(expectedCustomerPath, result.AdditionalFiles[1]);
571+
Assert.Equal(expectedProductPath, result.AdditionalFiles[2]);
568572
}
569573

570574
[Fact]
@@ -595,10 +599,12 @@ public void Save_Should_Write_Context_and_Entity_Files()
595599
// Assert
596600
var expectedContextPath = Path.Combine(directory.Path, "Contexts", Constants.Files.CSharpFiles.DbContextFile);
597601
var expectedCategoryPath = Path.Combine(directory.Path, "Models", Constants.Files.CSharpFiles.CategoryFile);
602+
var expectedCustomerPath = Path.Combine(directory.Path, "Models", Constants.Files.CSharpFiles.CustomerFile);
598603
var expectedProductPath = Path.Combine(directory.Path, "Models", Constants.Files.CSharpFiles.ProductFile);
599604
Assert.Equal(expectedContextPath, result.ContextFile);
600605
Assert.Equal(expectedCategoryPath, result.AdditionalFiles[0]);
601-
Assert.Equal(expectedProductPath, result.AdditionalFiles[1]);
606+
Assert.Equal(expectedCustomerPath, result.AdditionalFiles[1]);
607+
Assert.Equal(expectedProductPath, result.AdditionalFiles[2]);
602608
}
603609

604610
private IReverseEngineerScaffolder CreateScaffolder(ReverseEngineerOptions revEngOptions, bool useEntityNameMappings)
@@ -611,7 +617,7 @@ private IReverseEngineerScaffolder CreateScaffolder(ReverseEngineerOptions revEn
611617
}
612618

613619
private IReverseEngineerScaffolder CreateScaffolder(ReverseEngineerOptions revEngOptions,
614-
Action<HandlebarsScaffoldingOptions> configureOptions,bool useEntityTransformMappings = false,
620+
Action<HandlebarsScaffoldingOptions> configureOptions, bool useEntityTransformMappings = false,
615621
string filenamePrefix = null, bool useAltTemplates = false)
616622
{
617623
HandlebarsLib.Configuration.NoEscape = true;
@@ -709,7 +715,8 @@ private Dictionary<string, string> GetGeneratedFiles(ScaffoldedModel model, Reve
709715
|| options == ReverseEngineerOptions.DbContextAndEntities)
710716
{
711717
generatedFiles.Add(Constants.Files.CSharpFiles.CategoryFile, model.AdditionalFiles[0].Code);
712-
generatedFiles.Add(Constants.Files.CSharpFiles.ProductFile, model.AdditionalFiles[1].Code);
718+
generatedFiles.Add(Constants.Files.CSharpFiles.CustomerFile, model.AdditionalFiles[1].Code);
719+
generatedFiles.Add(Constants.Files.CSharpFiles.ProductFile, model.AdditionalFiles[2].Code);
713720
}
714721

715722
return generatedFiles;

test/Scaffolding.Handlebars.Tests/HbsTypeScriptScaffoldingGeneratorTests.cs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -275,9 +275,11 @@ public void Save_Should_Write_Entity_Files()
275275
// Assert
276276
var expectedContextPath = Path.Combine(directory.Path, "Contexts", Constants.Files.TypeScriptFiles.DbContextFile);
277277
var expectedCategoryPath = Path.Combine(directory.Path, "Models", Constants.Files.TypeScriptFiles.CategoryFile);
278+
var expectedCustomerPath = Path.Combine(directory.Path, "Models", Constants.Files.TypeScriptFiles.CustomerFile);
278279
var expectedProductPath = Path.Combine(directory.Path, "Models", Constants.Files.TypeScriptFiles.ProductFile);
279280
Assert.Equal(expectedCategoryPath, result.AdditionalFiles[0]);
280-
Assert.Equal(expectedProductPath, result.AdditionalFiles[1]);
281+
Assert.Equal(expectedCustomerPath, result.AdditionalFiles[1]);
282+
Assert.Equal(expectedProductPath, result.AdditionalFiles[2]);
281283
Assert.False(File.Exists(expectedContextPath));
282284
}
283285

@@ -310,10 +312,12 @@ public void Save_Should_Write_Context_and_Entity_Files_With_Prefix()
310312
// Assert
311313
var expectedContextPath = Path.Combine(directory.Path, "Contexts", $"{filenamePrefix}{Constants.Files.TypeScriptFiles.DbContextFile}");
312314
var expectedCategoryPath = Path.Combine(directory.Path, "Models", $"{filenamePrefix}{Constants.Files.TypeScriptFiles.CategoryFile}");
315+
var expectedCustomerPath = Path.Combine(directory.Path, "Models", $"{filenamePrefix}{Constants.Files.TypeScriptFiles.CustomerFile}");
313316
var expectedProductPath = Path.Combine(directory.Path, "Models", $"{filenamePrefix}{ Constants.Files.TypeScriptFiles.ProductFile}");
314317
Assert.Equal(expectedContextPath, result.ContextFile);
315318
Assert.Equal(expectedCategoryPath, result.AdditionalFiles[0]);
316-
Assert.Equal(expectedProductPath, result.AdditionalFiles[1]);
319+
Assert.Equal(expectedCustomerPath, result.AdditionalFiles[1]);
320+
Assert.Equal(expectedProductPath, result.AdditionalFiles[2]);
317321
}
318322

319323
[Fact]
@@ -344,10 +348,12 @@ public void Save_Should_Write_Context_and_Entity_Files()
344348
// Assert
345349
var expectedContextPath = Path.Combine(directory.Path, "Contexts", Constants.Files.TypeScriptFiles.DbContextFile);
346350
var expectedCategoryPath = Path.Combine(directory.Path, "Models", Constants.Files.TypeScriptFiles.CategoryFile);
351+
var expectedCustomerPath = Path.Combine(directory.Path, "Models", Constants.Files.TypeScriptFiles.CustomerFile);
347352
var expectedProductPath = Path.Combine(directory.Path, "Models", Constants.Files.TypeScriptFiles.ProductFile);
348353
Assert.Equal(expectedContextPath, result.ContextFile);
349354
Assert.Equal(expectedCategoryPath, result.AdditionalFiles[0]);
350-
Assert.Equal(expectedProductPath, result.AdditionalFiles[1]);
355+
Assert.Equal(expectedCustomerPath, result.AdditionalFiles[1]);
356+
Assert.Equal(expectedProductPath, result.AdditionalFiles[2]);
351357
}
352358

353359
private IReverseEngineerScaffolder CreateScaffolder(ReverseEngineerOptions options, string filenamePrefix = null)
@@ -437,7 +443,8 @@ private Dictionary<string, string> GetGeneratedFiles(ScaffoldedModel model, Reve
437443
|| options == ReverseEngineerOptions.DbContextAndEntities)
438444
{
439445
generatedFiles.Add(Constants.Files.TypeScriptFiles.CategoryFile, model.AdditionalFiles[0].Code);
440-
generatedFiles.Add(Constants.Files.TypeScriptFiles.ProductFile, model.AdditionalFiles[1].Code);
446+
generatedFiles.Add(Constants.Files.TypeScriptFiles.CustomerFile, model.AdditionalFiles[1].Code);
447+
generatedFiles.Add(Constants.Files.TypeScriptFiles.ProductFile, model.AdditionalFiles[2].Code);
441448
}
442449

443450
return generatedFiles;

test/Scaffolding.Handlebars.Tests/Helpers/Constants.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,14 @@ public static class CSharpFiles
4848
{
4949
public const string DbContextFile = Parameters.ContextName + ".cs";
5050
public const string CategoryFile = "Category.cs";
51+
public const string CustomerFile = "Customer.cs";
5152
public const string ProductFile = "Product.cs";
5253
}
5354
public static class TypeScriptFiles
5455
{
5556
public const string DbContextFile = Parameters.ContextName + ".cs";
5657
public const string CategoryFile = "Category.ts";
58+
public const string CustomerFile = "Customer.ts";
5759
public const string ProductFile = "Product.ts";
5860
}
5961
}

0 commit comments

Comments
 (0)