Skip to content

Commit e7ec43d

Browse files
authored
Merge pull request #118 from codingdna2/fix/issue98
Handlebars Transformers Issues
2 parents 8608acb + 984945c commit e7ec43d

File tree

4 files changed

+46
-21
lines changed

4 files changed

+46
-21
lines changed

src/EntityFrameworkCore.Scaffolding.Handlebars/HbsCSharpDbContextGenerator.cs

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -502,7 +502,7 @@ private void GenerateKey(IKey key, IEntityType entityType, bool useDataAnnotatio
502502

503503
var lines = new List<string>
504504
{
505-
$".{nameof(EntityTypeBuilder.HasKey)}(e => {GenerateLambdaToKey(key.Properties, "e")})"
505+
$".{nameof(EntityTypeBuilder.HasKey)}(e => {GenerateLambdaToKey(key.Properties, "e", EntityTypeTransformationService.TransformPropertyName)})"
506506
};
507507

508508
if (explicitName)
@@ -568,7 +568,7 @@ private void GenerateIndex(IIndex index, IndentedStringBuilder sb)
568568
{
569569
var lines = new List<string>
570570
{
571-
$".{nameof(EntityTypeBuilder.HasIndex)}(e => {GenerateLambdaToKey(index.Properties, "e")})"
571+
$".{nameof(EntityTypeBuilder.HasIndex)}(e => {GenerateLambdaToKey(index.Properties, "e", EntityTypeTransformationService.TransformPropertyName)})"
572572
};
573573

574574
var annotations = index.GetAnnotations().ToList();
@@ -623,7 +623,7 @@ private void GenerateProperty(IProperty property, bool useDataAnnotations, Inden
623623
{
624624
var lines = new List<string>
625625
{
626-
$".{nameof(EntityTypeBuilder.Property)}(e => e.{property.Name})"
626+
$".{nameof(EntityTypeBuilder.Property)}(e => e.{EntityTypeTransformationService.TransformPropertyName(property.Name, property.DeclaringType.Name)})"
627627
};
628628

629629
var annotations = property.GetAnnotations().ToList();
@@ -800,24 +800,24 @@ private void GenerateRelationship(IForeignKey foreignKey, bool useDataAnnotation
800800

801801
var lines = new List<string>
802802
{
803-
$".{nameof(EntityTypeBuilder.HasOne)}(" + (foreignKey.DependentToPrincipal != null ? $"d => d.{foreignKey.DependentToPrincipal.Name}" : null) + ")",
803+
$".{nameof(EntityTypeBuilder.HasOne)}(" + (foreignKey.DependentToPrincipal != null ? $"d => d.{EntityTypeTransformationService.TransformNavPropertyName(foreignKey.DependentToPrincipal.Name, foreignKey.PrincipalToDependent.DeclaringType.Name)}" : null) + ")",
804804
$".{(foreignKey.IsUnique ? nameof(ReferenceNavigationBuilder.WithOne) : nameof(ReferenceNavigationBuilder.WithMany))}"
805-
+ $"(" + (foreignKey.PrincipalToDependent != null ? $"p => p.{foreignKey.PrincipalToDependent.Name}" : null) + ")"
805+
+ $"(" + (foreignKey.PrincipalToDependent != null ? $"p => p.{EntityTypeTransformationService.TransformNavPropertyName(foreignKey.PrincipalToDependent.Name, foreignKey.DependentToPrincipal.DeclaringType.Name)}" : null) + ")"
806806
};
807807

808808
if (!foreignKey.PrincipalKey.IsPrimaryKey())
809809
{
810810
canUseDataAnnotations = false;
811811
lines.Add(
812812
$".{nameof(ReferenceReferenceBuilder.HasPrincipalKey)}"
813-
+ (foreignKey.IsUnique ? $"<{((ITypeBase)foreignKey.PrincipalEntityType).DisplayName()}>" : "")
814-
+ $"(p => {GenerateLambdaToKey(foreignKey.PrincipalKey.Properties, "p")})");
813+
+ (foreignKey.IsUnique ? $"<{EntityTypeTransformationService.TransformPropertyName(((ITypeBase)foreignKey.PrincipalEntityType).DisplayName(), "")}>" : "")
814+
+ $"(p => {GenerateLambdaToKey(foreignKey.PrincipalKey.Properties, "p", EntityTypeTransformationService.TransformNavPropertyName)})");
815815
}
816816

817817
lines.Add(
818818
$".{nameof(ReferenceReferenceBuilder.HasForeignKey)}"
819-
+ (foreignKey.IsUnique ? $"<{((ITypeBase)foreignKey.DeclaringEntityType).DisplayName()}>" : "")
820-
+ $"(d => {GenerateLambdaToKey(foreignKey.Properties, "d")})");
819+
+ (foreignKey.IsUnique ? $"<{EntityTypeTransformationService.TransformEntityName(((ITypeBase)foreignKey.DeclaringEntityType).DisplayName())}>" : "")
820+
+ $"(d => {GenerateLambdaToKey(foreignKey.Properties, "d", EntityTypeTransformationService.TransformPropertyName)})");
821821

822822
var defaultOnDeleteAction = foreignKey.IsRequired
823823
? DeleteBehavior.Cascade
@@ -942,13 +942,14 @@ private void GenerateSequence(ISequence sequence, IndentedStringBuilder sb)
942942

943943
private static string GenerateLambdaToKey(
944944
IReadOnlyList<IProperty> properties,
945-
string lambdaIdentifier)
945+
string lambdaIdentifier,
946+
Func<string, string, string> nameTransform)
946947
{
947948
return properties.Count <= 0
948949
? ""
949950
: properties.Count == 1
950-
? $"{lambdaIdentifier}.{properties[0].Name}"
951-
: $"new {{ {string.Join(", ", properties.Select(p => lambdaIdentifier + "." + p.Name))} }}";
951+
? $"{lambdaIdentifier}.{nameTransform(properties[0].Name, properties[0].DeclaringType.Name)}"
952+
: $"new {{ {string.Join(", ", properties.Select(p => lambdaIdentifier + "." + nameTransform(p.Name, p.DeclaringType.Name)))} }}";
952953
}
953954

954955
private static void RemoveAnnotation(ref List<IAnnotation> annotations, string annotationName)

src/EntityFrameworkCore.Scaffolding.Handlebars/HbsCSharpEntityTypeGenerator.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -416,11 +416,11 @@ private void GenerateForeignKeyAttribute(INavigation navigation)
416416
{
417417
foreignKeyAttribute.AddParameter(
418418
CSharpHelper.Literal(
419-
string.Join(",", navigation.ForeignKey.Properties.Select(p => p.Name))));
419+
string.Join(",", navigation.ForeignKey.Properties.Select(p => EntityTypeTransformationService.TransformNavPropertyName(p.Name, p.ClrType.Name)))));
420420
}
421421
else
422-
{
423-
foreignKeyAttribute.AddParameter($"nameof({navigation.ForeignKey.Properties.First().Name})");
422+
{
423+
foreignKeyAttribute.AddParameter($"nameof({EntityTypeTransformationService.TransformNavPropertyName(navigation.ForeignKey.Properties.First().Name, navigation.ForeignKey.Properties.First().ClrType.Name)})");
424424
}
425425

426426
NavPropertyAnnotations.Add(new Dictionary<string, object>
@@ -441,11 +441,13 @@ private void GenerateInversePropertyAttribute(INavigation navigation)
441441
{
442442
var inversePropertyAttribute = new AttributeWriter(nameof(InversePropertyAttribute));
443443

444+
var propertyName = EntityTypeTransformationService.TransformNavPropertyName(inverseNavigation.Name, navigation.DeclaringType.Name);
444445
inversePropertyAttribute.AddParameter(
445446
!navigation.DeclaringEntityType.GetPropertiesAndNavigations().Any(
446-
m => m.Name == inverseNavigation.DeclaringEntityType.Name)
447-
? $"nameof({inverseNavigation.DeclaringEntityType.Name}.{inverseNavigation.Name})"
448-
: CSharpHelper.Literal(inverseNavigation.Name));
447+
m => m.Name == inverseNavigation.DeclaringEntityType.Name ||
448+
EntityTypeTransformationService.TransformNavPropertyName(m.Name, navigation.GetTargetType().Name) == EntityTypeTransformationService.TransformNavPropertyName(inverseNavigation.DeclaringEntityType.Name, navigation.GetTargetType().Name))
449+
? $"nameof({EntityTypeTransformationService.TransformEntityName(inverseNavigation.DeclaringType.Name)}.{propertyName})"
450+
: CSharpHelper.Literal(propertyName));
449451

450452
NavPropertyAnnotations.Add(new Dictionary<string, object>
451453
{

src/EntityFrameworkCore.Scaffolding.Handlebars/HbsEntityTypeTransformationService.cs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,26 @@ public string TransformEntityFileName(string entityFileName) =>
7474
/// Transform single property name.
7575
/// </summary>
7676
/// <param name="propertyName">Property name.</param>
77+
/// <param name="propertyType">Property type</param>
7778
/// <returns>Transformed property name.</returns>
78-
public string TransformPropertyName(string propertyName)
79+
public string TransformPropertyName(string propertyName, string propertyType)
7980
{
80-
var propTypeInfo = new EntityPropertyInfo { PropertyName = propertyName };
81+
var propTypeInfo = new EntityPropertyInfo { PropertyName = propertyName, PropertyType = propertyType };
8182
return PropertyTransformer?.Invoke(propTypeInfo)?.PropertyName ?? propertyName;
8283
}
8384

85+
/// <summary>
86+
/// Transform single navigation property name.
87+
/// </summary>
88+
/// <param name="propertyName">Property name.</param>
89+
/// <param name="propertyType">Property type</param>
90+
/// <returns>Transformed property name.</returns>
91+
public string TransformNavPropertyName(string propertyName, string propertyType)
92+
{
93+
var propTypeInfo = new EntityPropertyInfo { PropertyName = propertyName, PropertyType = propertyType };
94+
return NavPropertyTransformer?.Invoke(propTypeInfo)?.PropertyName ?? propertyName;
95+
}
96+
8497
/// <summary>
8598
/// Transform entity type constructor.
8699
/// </summary>

src/EntityFrameworkCore.Scaffolding.Handlebars/IEntityTypeTransformationService.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,17 @@ public interface IEntityTypeTransformationService
2525
/// Transform single property name.
2626
/// </summary>
2727
/// <param name="propertyName">Property name.</param>
28+
/// <param name="propertyType">Property type</param>
2829
/// <returns>Transformed property name.</returns>
29-
string TransformPropertyName(string propertyName);
30+
string TransformPropertyName(string propertyName, string propertyType);
31+
32+
/// <summary>
33+
/// Transform single navigation property name.
34+
/// </summary>
35+
/// <param name="propertyName">Property name.</param>
36+
/// <param name="propertyType">Property type</param>
37+
/// <returns>Transformed property name.</returns>
38+
string TransformNavPropertyName(string propertyName, string propertyType);
3039

3140
/// <summary>
3241
/// Transform entity type constructor.

0 commit comments

Comments
 (0)