Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 14 additions & 7 deletions sample/ScaffoldingSample/ScaffoldingDesignTimeServices.cs
Original file line number Diff line number Diff line change
Expand Up @@ -61,18 +61,25 @@ public void ConfigureDesignTimeServices(IServiceCollection services)

// Add Handlebars transformer for Country property
services.AddHandlebarsTransformers(
propertyTransformer: e =>
e.PropertyName == "Country"
? new EntityPropertyInfo("Country", e.PropertyName, false)
: new EntityPropertyInfo(e.PropertyType, e.PropertyName, e.PropertyIsNullable));
propertyTransformer: (e, p) =>
p.PropertyName == "Country"
? new EntityPropertyInfo("Country", p.PropertyName, false)
: new EntityPropertyInfo(p.PropertyType, p.PropertyName, p.PropertyIsNullable));

// Add Handlebars transformer for Id property
//services.AddHandlebarsTransformers(
// propertyTransformer: (e, p) =>
// $"{e.Name}Id" == p.PropertyName
// ? new EntityPropertyInfo(p.PropertyType, "Id", false)
// : new EntityPropertyInfo(p.PropertyType, p.PropertyName, p.PropertyIsNullable));

// Add optional Handlebars transformers
//services.AddHandlebarsTransformers(
// entityNameTransformer: n => n + "Foo",
// entityFileNameTransformer: n => n + "Foo",
// constructorTransformer: e => new EntityPropertyInfo(e.PropertyType + "Foo", e.PropertyName + "Foo"),
// propertyTransformer: e => new EntityPropertyInfo(e.PropertyType, e.PropertyName + "Foo"),
// navPropertyTransformer: e => new EntityPropertyInfo(e.PropertyType + "Foo", e.PropertyName + "Foo"));
// constructorTransformer: (e, p) => new EntityPropertyInfo(p.PropertyType + "Foo", p.PropertyName + "Foo"),
// propertyTransformer: (e, p) => new EntityPropertyInfo(p.PropertyType, p.PropertyName + "Foo"),
// navPropertyTransformer: (e, p) => new EntityPropertyInfo(p.PropertyType + "Foo", p.PropertyName + "Foo"));
}

// Sample Handlebars helper
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -392,18 +392,18 @@ private void GenerateEntityType(IEntityType entityType, bool useDataAnnotations,

if (!useDataAnnotations || indexAnnotations.Count > 0)
{
GenerateIndex(index, sb);
GenerateIndex(entityType, index, sb);
}
}

foreach (var property in entityType.GetProperties())
{
GenerateProperty(property, useDataAnnotations, sb);
GenerateProperty(entityType, property, useDataAnnotations, sb);
}

foreach (var foreignKey in entityType.GetScaffoldForeignKeys(_options.Value))
{
GenerateRelationship(foreignKey, useDataAnnotations, sb);
GenerateRelationship(entityType, foreignKey, useDataAnnotations, sb);
}
}

Expand Down Expand Up @@ -478,7 +478,7 @@ private void GenerateKey(IKey key, IEntityType entityType, bool useDataAnnotatio

var lines = new List<string>
{
$".{nameof(EntityTypeBuilder.HasKey)}(e => {GenerateLambdaToKey(key.Properties, "e", EntityTypeTransformationService.TransformPropertyName)})"
$".{nameof(EntityTypeBuilder.HasKey)}(e => {GenerateLambdaToKey(entityType, key.Properties, "e", EntityTypeTransformationService.TransformPropertyName)})"
};

if (explicitName)
Expand Down Expand Up @@ -536,7 +536,7 @@ private void GenerateTableName(IEntityType entityType, IndentedStringBuilder sb)
}
}

private void GenerateIndex(IIndex index, IndentedStringBuilder sb)
private void GenerateIndex(IEntityType entityType, IIndex index, IndentedStringBuilder sb)
{
var annotations = AnnotationCodeGenerator
.FilterIgnoredAnnotations(index.GetAnnotations())
Expand All @@ -545,7 +545,7 @@ private void GenerateIndex(IIndex index, IndentedStringBuilder sb)

var lines = new List<string>
{
$".{nameof(EntityTypeBuilder.HasIndex)}(e => {GenerateLambdaToKey(index.Properties, "e", EntityTypeTransformationService.TransformPropertyName)})"
$".{nameof(EntityTypeBuilder.HasIndex)}(e => {GenerateLambdaToKey(entityType, index.Properties, "e", EntityTypeTransformationService.TransformPropertyName)})"
};
annotations.Remove(RelationalAnnotationNames.Name);

Expand All @@ -561,11 +561,11 @@ private void GenerateIndex(IIndex index, IndentedStringBuilder sb)
AppendMultiLineFluentApi(index.DeclaringEntityType, lines, sb);
}

private void GenerateProperty(IProperty property, bool useDataAnnotations, IndentedStringBuilder sb)
private void GenerateProperty(IEntityType entityType, IProperty property, bool useDataAnnotations, IndentedStringBuilder sb)
{
var lines = new List<string>
{
$".{nameof(EntityTypeBuilder.Property)}(e => e.{EntityTypeTransformationService.TransformPropertyName(property.Name, property.DeclaringType.Name)})"
$".{nameof(EntityTypeBuilder.Property)}(e => e.{EntityTypeTransformationService.TransformPropertyName(entityType, property.Name, property.DeclaringType.Name)})"
};

var annotations = AnnotationCodeGenerator
Expand Down Expand Up @@ -684,7 +684,7 @@ private void GenerateProperty(IProperty property, bool useDataAnnotations, Inden
AppendMultiLineFluentApi(property.DeclaringEntityType, lines, sb);
}

private void GenerateRelationship(IForeignKey foreignKey, bool useDataAnnotations, IndentedStringBuilder sb)
private void GenerateRelationship(IEntityType entityType, IForeignKey foreignKey, bool useDataAnnotations, IndentedStringBuilder sb)
{
var canUseDataAnnotations = true;
var annotations = AnnotationCodeGenerator
Expand All @@ -695,11 +695,11 @@ private void GenerateRelationship(IForeignKey foreignKey, bool useDataAnnotation
var lines = new List<string>
{
$".{nameof(EntityTypeBuilder.HasOne)}("
+ (foreignKey.DependentToPrincipal != null ? $"d => d.{EntityTypeTransformationService.TransformNavPropertyName(foreignKey.DependentToPrincipal?.Name, foreignKey.PrincipalToDependent?.DeclaringType.Name)}" : null)
+ (foreignKey.DependentToPrincipal != null ? $"d => d.{EntityTypeTransformationService.TransformNavPropertyName(entityType, foreignKey.DependentToPrincipal?.Name, foreignKey.PrincipalToDependent?.DeclaringType.Name)}" : null)
+ ")",
$".{(foreignKey.IsUnique ? nameof(ReferenceNavigationBuilder.WithOne) : nameof(ReferenceNavigationBuilder.WithMany))}"
+ "("
+ (foreignKey.PrincipalToDependent != null ? $"p => p.{EntityTypeTransformationService.TransformNavPropertyName(foreignKey.PrincipalToDependent?.Name, foreignKey.DependentToPrincipal?.DeclaringType.Name)}" : null)
+ (foreignKey.PrincipalToDependent != null ? $"p => p.{EntityTypeTransformationService.TransformNavPropertyName(entityType, foreignKey.PrincipalToDependent?.Name, foreignKey.DependentToPrincipal?.DeclaringType.Name)}" : null)
+ ")"
};

Expand All @@ -708,14 +708,14 @@ private void GenerateRelationship(IForeignKey foreignKey, bool useDataAnnotation
canUseDataAnnotations = false;
lines.Add(
$".{nameof(ReferenceReferenceBuilder.HasPrincipalKey)}"
+ (foreignKey.IsUnique ? $"<{EntityTypeTransformationService.TransformPropertyName(((ITypeBase)foreignKey.PrincipalEntityType).DisplayName(), "")}>" : "")
+ $"(p => {GenerateLambdaToKey(foreignKey.PrincipalKey.Properties, "p", EntityTypeTransformationService.TransformNavPropertyName)})");
+ (foreignKey.IsUnique ? $"<{EntityTypeTransformationService.TransformPropertyName(entityType, ((ITypeBase)foreignKey.PrincipalEntityType).DisplayName(), "")}>" : "")
+ $"(p => {GenerateLambdaToKey(entityType, foreignKey.PrincipalKey.Properties, "p", EntityTypeTransformationService.TransformNavPropertyName)})");
}

lines.Add(
$".{nameof(ReferenceReferenceBuilder.HasForeignKey)}"
+ (foreignKey.IsUnique ? $"<{GetEntityTypeName(foreignKey.PrincipalEntityType, EntityTypeTransformationService.TransformTypeEntityName(((ITypeBase)foreignKey.DeclaringEntityType).DisplayName()))}>" : "")
+ $"(d => {GenerateLambdaToKey(foreignKey.Properties, "d", EntityTypeTransformationService.TransformPropertyName)})");
+ $"(d => {GenerateLambdaToKey(entityType, foreignKey.Properties, "d", EntityTypeTransformationService.TransformPropertyName)})");

var defaultOnDeleteAction = foreignKey.IsRequired
? DeleteBehavior.Cascade
Expand Down Expand Up @@ -854,15 +854,16 @@ private string GetOnConfiguring(string connectionString, bool suppressConnection
}

private static string GenerateLambdaToKey(
IEntityType entityType,
IReadOnlyList<IProperty> properties,
string lambdaIdentifier,
Func<string, string, string> nameTransform)
Func<IEntityType, string, string, string> nameTransform)
{
return properties.Count <= 0
? ""
: properties.Count == 1
? $"{lambdaIdentifier}.{nameTransform(properties[0].Name, properties[0].DeclaringType.Name)}"
: $"new {{ {string.Join(", ", properties.Select(p => lambdaIdentifier + "." + nameTransform(p.Name, p.DeclaringType.Name)))} }}";
? $"{lambdaIdentifier}.{nameTransform(entityType, properties[0].Name, properties[0].DeclaringType.Name)}"
: $"new {{ {string.Join(", ", properties.Select(p => lambdaIdentifier + "." + nameTransform(entityType, p.Name, p.DeclaringType.Name)))} }}";
}

private static void RemoveAnnotation(ref List<IAnnotation> annotations, string annotationName)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ protected override void GenerateConstructor(IEntityType entityType)
});
}

var transformedLines = EntityTypeTransformationService.TransformConstructor(lines);
var transformedLines = EntityTypeTransformationService.TransformConstructor(entityType, lines);

TemplateData.Add("lines", transformedLines);
}
Expand Down Expand Up @@ -249,7 +249,7 @@ protected override void GenerateProperties(IEntityType entityType)
});
}

var transformedProperties = EntityTypeTransformationService.TransformProperties(properties);
var transformedProperties = EntityTypeTransformationService.TransformProperties(entityType, properties);

TemplateData.Add("properties", transformedProperties);
}
Expand Down Expand Up @@ -304,7 +304,7 @@ protected override void GenerateNavigationProperties(IEntityType entityType)

if (UseDataAnnotations)
{
GenerateNavigationDataAnnotations(navigation);
GenerateNavigationDataAnnotations(entityType, navigation);
}

var propertyIsNullable = !navigation.IsCollection && (
Expand All @@ -330,7 +330,7 @@ protected override void GenerateNavigationProperties(IEntityType entityType)
});
}

var transformedNavProperties = EntityTypeTransformationService.TransformNavigationProperties(navProperties);
var transformedNavProperties = EntityTypeTransformationService.TransformNavigationProperties(entityType, navProperties);

TemplateData.Add("nav-properties", transformedNavProperties);
}
Expand Down Expand Up @@ -520,15 +520,15 @@ private void GenerateRequiredAttribute(IProperty property)
}
}

private void GenerateNavigationDataAnnotations(INavigation navigation)
private void GenerateNavigationDataAnnotations(IEntityType entityType, INavigation navigation)
{
if (navigation == null) throw new ArgumentNullException(nameof(navigation));

GenerateForeignKeyAttribute(navigation);
GenerateInversePropertyAttribute(navigation);
GenerateForeignKeyAttribute(entityType, navigation);
GenerateInversePropertyAttribute(entityType, navigation);
}

private void GenerateForeignKeyAttribute(INavigation navigation)
private void GenerateForeignKeyAttribute(IEntityType entityType, INavigation navigation)
{
if (navigation.IsOnDependent)
{
Expand All @@ -540,11 +540,11 @@ private void GenerateForeignKeyAttribute(INavigation navigation)
{
foreignKeyAttribute.AddParameter(
CSharpHelper.Literal(
string.Join(",", navigation.ForeignKey.Properties.Select(p => EntityTypeTransformationService.TransformNavPropertyName(p.Name, p.ClrType.Name)))));
string.Join(",", navigation.ForeignKey.Properties.Select(p => EntityTypeTransformationService.TransformNavPropertyName(entityType, p.Name, p.ClrType.Name)))));
}
else
{
foreignKeyAttribute.AddParameter($"nameof({EntityTypeTransformationService.TransformNavPropertyName(navigation.ForeignKey.Properties.First().Name, navigation.ForeignKey.Properties.First().ClrType.Name)})");
foreignKeyAttribute.AddParameter($"nameof({EntityTypeTransformationService.TransformNavPropertyName(entityType, navigation.ForeignKey.Properties.First().Name, navigation.ForeignKey.Properties.First().ClrType.Name)})");
}

NavPropertyAnnotations.Add(new Dictionary<string, object>
Expand All @@ -555,7 +555,7 @@ private void GenerateForeignKeyAttribute(INavigation navigation)
}
}

private void GenerateInversePropertyAttribute(INavigation navigation)
private void GenerateInversePropertyAttribute(IEntityType entityType, INavigation navigation)
{
if (navigation.ForeignKey.PrincipalKey.IsPrimaryKey())
{
Expand All @@ -565,12 +565,12 @@ private void GenerateInversePropertyAttribute(INavigation navigation)
{
var inversePropertyAttribute = new AttributeWriter(nameof(InversePropertyAttribute));

var propertyName = EntityTypeTransformationService.TransformNavPropertyName(inverseNavigation.Name, navigation.DeclaringType.Name);
var propertyName = EntityTypeTransformationService.TransformNavPropertyName(entityType, inverseNavigation.Name, navigation.DeclaringType.Name);
inversePropertyAttribute.AddParameter(
!navigation.DeclaringEntityType.GetPropertiesAndNavigations().Any(
m => m.Name == inverseNavigation.DeclaringEntityType.Name ||
EntityTypeTransformationService.TransformNavPropertyName(m.Name, navigation.TargetEntityType.Name)
== EntityTypeTransformationService.TransformNavPropertyName(inverseNavigation.DeclaringEntityType.Name, navigation.TargetEntityType.Name))
EntityTypeTransformationService.TransformNavPropertyName(entityType, m.Name, navigation.TargetEntityType.Name)
== EntityTypeTransformationService.TransformNavPropertyName(entityType, inverseNavigation.DeclaringEntityType.Name, navigation.TargetEntityType.Name))
? $"nameof({EntityTypeTransformationService.TransformTypeEntityName(inverseNavigation.DeclaringType.Name)}.{propertyName})"
: CSharpHelper.Literal(propertyName));

Expand Down
Loading