From 32bf670b9e09a8d5c2f130be30b473f9e26cd61f Mon Sep 17 00:00:00 2001 From: CodeLiturgy Date: Mon, 5 Sep 2022 03:58:28 +0100 Subject: [PATCH] Get one template working --- .../EfMethods/EfGeneratorContext.cs | 77 ++++++++++-- .../EfMethods/EfMethodsGenerator.cs | 2 +- .../EfMethods/EfMethodsSource.cs | 115 ++---------------- .../EfAddEntityTemplateSource.cs | 60 +++++++++ .../EfGetOneEntityByTemplate.cs | 63 ++++++++++ .../EfUpdateEntityTemplateSource.cs | 62 ++++++++++ src/BlueWest.MapTo/Models.cs | 104 ++++++++++++---- 7 files changed, 346 insertions(+), 137 deletions(-) create mode 100644 src/BlueWest.MapTo/EfMethods/EfMethodsSource/EfAddEntityTemplateSource.cs create mode 100644 src/BlueWest.MapTo/EfMethods/EfMethodsSource/EfGetOneEntityByTemplate.cs create mode 100644 src/BlueWest.MapTo/EfMethods/EfMethodsSource/EfUpdateEntityTemplateSource.cs diff --git a/src/BlueWest.MapTo/EfMethods/EfGeneratorContext.cs b/src/BlueWest.MapTo/EfMethods/EfGeneratorContext.cs index 81ea626..96ffac9 100644 --- a/src/BlueWest.MapTo/EfMethods/EfGeneratorContext.cs +++ b/src/BlueWest.MapTo/EfMethods/EfGeneratorContext.cs @@ -272,31 +272,39 @@ namespace MapTo var addAttributeSymbols = GetAllowedMemberSyntaxes(EfAddMethodsAttributeSource.AttributeName); var updateAttributesMembers = GetAllowedMemberSyntaxes(EfUpdateMethodsAttributeSource.AttributeName); + + var getOneAttributesMembers = GetAllowedMemberSyntaxes(EfGetOneByAttributeSource.AttributeName); - List methodsModels = new List(); - - foreach (var uProperty in updateAttributesMembers) + List methodsModels = new List(); + + foreach (var uProperty in getOneAttributesMembers) { - - var newUpdateModel = ExtractEfUpdateMethodsModel(semanticModel, uProperty); + var newUpdateModel = ExtractEfGetEntityByModel(semanticModel, uProperty); methodsModels.Add(newUpdateModel); } - - + + foreach (var uProperty in addAttributeSymbols) { var entityTypeData = GetEntityTypeData(uProperty, semanticModel); string entityIdentifierName = entityTypeData.Name; string entityFullName = entityTypeData.ToDisplayString(); - var propertyNamex = (uProperty as PropertyDeclarationSyntax ).Identifier.ValueText; + var propertyNamex = (uProperty as PropertyDeclarationSyntax).Identifier.ValueText; var entityDataModel = new EfEntityDataModel(propertyNamex, entityFullName, entityIdentifierName); var newAddModel = ExtractEfAddMethodsModel(semanticModel, uProperty, entityDataModel); methodsModels.Add(newAddModel); } - - + + foreach (var uProperty in updateAttributesMembers) + { + var newUpdateModel = ExtractEfUpdateMethodsModel(semanticModel, uProperty); + methodsModels.Add(newUpdateModel); + } + + + //SpinWait.SpinUntil(() => Debugger.IsAttached); return new EfMethodsModel( @@ -390,6 +398,55 @@ namespace MapTo return new EfUpdateMethodsModel(entityDataModel, updateTypeFullName, updateTypeIdentifierName, returnTypeFullName, returnTypeIdentifierName, keyPropertyName, keyMemberFullName); } + + private EfGetOneByModel ExtractEfGetEntityByModel(SemanticModel semanticModel, MemberDeclarationSyntax uProperty) + { + //SpinWait.SpinUntil(() => Debugger.IsAttached); + var entityTypeData = GetEntityTypeData(uProperty, semanticModel); + string entityIdentifierName = entityTypeData.Name; + string entityFullName = entityTypeData.ToDisplayString(); + var propertyNamex = (uProperty as PropertyDeclarationSyntax).Identifier.ValueText; + var entityDataModel = new EfEntityDataModel(propertyNamex, entityFullName, entityIdentifierName); + + var efTypeofSymbols = + GetEntityTypeSymbol(uProperty, EfGetOneByAttributeSource.AttributeName, semanticModel); + + var byParamPropertyName = ExtractNameOfMemberName(uProperty, EfGetOneByAttributeSource.AttributeName, semanticModel); + + var keyMemberType = FindFirstTypeInfoOfMemberExpressionSyntax(semanticModel, TypeSyntax); + + var secondTypeInfo = FindSecondTypeInfoOfMemberExpressionSyntax(semanticModel, TypeSyntax); + + + + + var byParamFullName = keyMemberType.Value.Type.ToDisplayString(); + var byParamMemberName = keyMemberType.Value.Type.Name; + + // Try grabbing string literal if there's no nameof in it + if (byParamPropertyName == string.Empty) + { + byParamPropertyName = GetEntityStringLiteralSymbol(TypeSyntax, EfGetOneByAttributeSource.AttributeName, semanticModel) + .FirstOrDefault()? + .Token.ValueText ?? "Id"; + } + + if (efTypeofSymbols == null) return null; + + string returnTypeIdentifierName = entityDataModel.EntityTypeIdentifierName; + string returnTypeFullName = entityDataModel.EntityTypeFullName; + + + // Grab return type from attribute argument + if (efTypeofSymbols.Length > 0) + { + returnTypeIdentifierName = efTypeofSymbols[0].Name; + returnTypeFullName = efTypeofSymbols[0].ToDisplayString(); + } + + + return new EfGetOneByModel(entityDataModel, byParamPropertyName, byParamFullName, returnTypeFullName, returnTypeIdentifierName); + } protected ImmutableArray GetSymbolsFromAttribute(ITypeSymbol typeSymbol, INamedTypeSymbol attributeTypeSymbol) diff --git a/src/BlueWest.MapTo/EfMethods/EfMethodsGenerator.cs b/src/BlueWest.MapTo/EfMethods/EfMethodsGenerator.cs index c90adeb..f0fd11d 100644 --- a/src/BlueWest.MapTo/EfMethods/EfMethodsGenerator.cs +++ b/src/BlueWest.MapTo/EfMethods/EfMethodsGenerator.cs @@ -68,7 +68,7 @@ namespace MapTo var (source, hintName) = candidateMember switch { - ClassDeclarationSyntax => EfMethodsSource.Generate(mappingContext.Model, addSourceTemplate, updateSourceTemplate), + ClassDeclarationSyntax => EfMethodsSource.Generate(mappingContext.Model, addSourceTemplate, updateSourceTemplate, getOneByTemplate), _ => throw new ArgumentOutOfRangeException() }; diff --git a/src/BlueWest.MapTo/EfMethods/EfMethodsSource.cs b/src/BlueWest.MapTo/EfMethods/EfMethodsSource.cs index be58f3d..81a8e6a 100644 --- a/src/BlueWest.MapTo/EfMethods/EfMethodsSource.cs +++ b/src/BlueWest.MapTo/EfMethods/EfMethodsSource.cs @@ -11,7 +11,7 @@ namespace MapTo.Sources { internal static class EfMethodsSource { - internal static SourceCode Generate(EfMethodsModel model, string addSourceTemplate, string updateSourceTemplate) + internal static SourceCode Generate(EfMethodsModel model, string addSourceTemplate, string updateSourceTemplate, string getOneBySourceTemplate) { using var builder = new SourceBuilder(); @@ -35,7 +35,8 @@ namespace MapTo.Sources .WriteOpeningBracket() .WriteLine(); - foreach (var methodModel in model.MethodsModels) + + foreach (var methodModel in model.MethodsModels.OrderBy(x => x.PropertyName)) { if (methodModel is EfAddMethodsModel m) { @@ -52,6 +53,14 @@ namespace MapTo.Sources .WriteLine(); continue; } + if (methodModel is EfGetOneByModel getOneByModel) + { + builder + .EfAddGetOneEntityByMethod(model, getOneByModel, getOneBySourceTemplate) + .WriteLine(); + continue; + } + } @@ -67,7 +76,7 @@ namespace MapTo.Sources return new(generatedCode, hintName); } - private static SourceBuilder ParseTemplate(this SourceBuilder builder, string finalTemplate) + internal static SourceBuilder ParseTemplate(this SourceBuilder builder, string finalTemplate) { string[] array = finalTemplate.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries); @@ -80,107 +89,7 @@ namespace MapTo.Sources return builder; } - private static SourceBuilder EfAddAddEntityMethod(this SourceBuilder builder, EfMethodsModel methodsModel, EfAddMethodsModel model, string addSourceTemplate) - { - var returnTypeFullName = model.ReturnTypeFullName; - var createTypeFullName = model.CreateTypeFullName; - var newEntityVarName = $"new{model.Entity.EntityTypeIdentifierName}"; - var toCreateVarName = $"{model.Entity.EntityTypeIdentifierName.ToCamelCase()}ToCreate"; - - var entityTypeName = model.Entity.EntityTypeIdentifierName; - var contextFullName = methodsModel.ContextFullType; - var propertyName = model.Entity.PropertyName; - - if (!addSourceTemplate.IsEmpty()) - { - var templateToSourceBuilder = new StringBuilder(addSourceTemplate); - templateToSourceBuilder - .Replace("{entityTypeName}", model.Entity.EntityTypeIdentifierName) - .Replace("{returnTypeFullName}", returnTypeFullName) - .Replace("{createTypeFullName}", createTypeFullName) - .Replace("{contextFullName}", contextFullName) - .Replace("{toCreateVarName}", toCreateVarName) - .Replace("{newEntityVarName}", newEntityVarName) - .Replace("{entityTypeFullName}", model.Entity.EntityTypeFullName) - .Replace("{propertyName}", propertyName); - - builder - .ParseTemplate(templateToSourceBuilder.ToString()); - } - - if (addSourceTemplate.IsEmpty()) - { - builder - .WriteComment("Generated body") - .WriteLine(GeneratedFilesHeader) - .WriteLine($"public static (bool, {model.ReturnTypeFullName}) Add{entityTypeName}(") - .WriteLine($"this {contextFullName} dbContext,") - .WriteLine($"{createTypeFullName} {toCreateVarName})") - .WriteOpeningBracket() - .WriteLine($"var {newEntityVarName} = new {model.Entity.EntityTypeFullName}({toCreateVarName});") - .WriteLine($"dbContext.{propertyName}.Add({newEntityVarName});") - .WriteLine($"var success = dbContext.SaveChanges() >= 0;") - .WriteLine($"return (success, new {returnTypeFullName}({newEntityVarName}));") - .WriteClosingBracket(); - - builder - .WriteLine(); - } - - return builder; - } - private static SourceBuilder EfAddUpdateEntityMethod(this SourceBuilder builder, EfMethodsModel methodsModel, EfUpdateMethodsModel model, string updateSourceTemplate) - { - var entityTypeName = model.Entity.EntityTypeIdentifierName; - var contextFullName = methodsModel.ContextFullType; - var propertyName = model.Entity.PropertyName; - var returnTypeFullName = model.ReturnTypeFullName; - var updateTypeFullName = model.UpdateTypeFullName; - var updateVarName = $"{entityTypeName.ToCamelCase()}ToUpdate"; - var keyPropertyName = model.keyPropertyName; - var keyTypeFullName = model.keyFullTypeName; - var existingVarName = entityTypeName.ToCamelCase(); - var keyVarName = entityTypeName.ToCamelCase() + model.keyPropertyName; - if (!updateSourceTemplate.IsEmpty()) - { - var templateToSourceBuilder = new StringBuilder(updateSourceTemplate); - templateToSourceBuilder - .Replace("{entityTypeName}", entityTypeName) - .Replace("{returnTypeFullName}", returnTypeFullName) - .Replace("{updateTypeFullName}", updateTypeFullName) - .Replace("{updateVarName}", updateVarName) - .Replace("{contextFullName}", contextFullName) - .Replace("{propertyName}", propertyName) - .Replace("{keyTypeFullName}", keyTypeFullName) - .Replace("{keyPropertyName}", keyPropertyName) - .Replace("{keyVarName}", keyVarName) - .Replace("{existingEntityVarName}", existingVarName); - builder - .ParseTemplate(templateToSourceBuilder.ToString()); - } - - if (updateSourceTemplate.IsEmpty()) - { - builder - .WriteComment("Generated body") - .WriteLine($"public static (bool, {returnTypeFullName}) Update{entityTypeName}(") - .WriteLine($"this {contextFullName} dbContext,") - .WriteLine($"{updateTypeFullName} {updateVarName},") - .WriteLine($"{keyTypeFullName} {keyVarName})") - .WriteOpeningBracket() - .WriteLine($"var {existingVarName} = dbContext.{propertyName}.FirstOrDefault(x => x.{keyPropertyName} == {keyVarName});") - .WriteLine($"if ({existingVarName} == null) return (false, null);") - .WriteLine($"var success = dbContext.SaveChanges() >= 0;") - .WriteLine($"return (success, new {returnTypeFullName}({existingVarName}));") - .WriteClosingBracket(); - - builder - .WriteLine(); - } - - return builder; - } } diff --git a/src/BlueWest.MapTo/EfMethods/EfMethodsSource/EfAddEntityTemplateSource.cs b/src/BlueWest.MapTo/EfMethods/EfMethodsSource/EfAddEntityTemplateSource.cs new file mode 100644 index 0000000..a75441a --- /dev/null +++ b/src/BlueWest.MapTo/EfMethods/EfMethodsSource/EfAddEntityTemplateSource.cs @@ -0,0 +1,60 @@ +using MapTo.Extensions; +using System; +using System.Collections.Generic; +using System.Text; + +namespace MapTo.Sources +{ + internal static class EfAddEntityTemplateSource + { + internal static SourceBuilder EfAddAddEntityMethod(this SourceBuilder builder, EfMethodsModel methodsModel, EfAddMethodsModel model, string addSourceTemplate) + { + var returnTypeFullName = model.ReturnTypeFullName; + var createTypeFullName = model.CreateTypeFullName; + var newEntityVarName = $"new{model.EntityTypeIdentifierName}"; + var toCreateVarName = $"{model.EntityTypeIdentifierName.ToCamelCase()}ToCreate"; + + var entityTypeName = model.EntityTypeIdentifierName; + var contextFullName = methodsModel.ContextFullType; + var propertyName = model.PropertyName; + + if (!addSourceTemplate.IsEmpty()) + { + var templateToSourceBuilder = new StringBuilder(addSourceTemplate); + templateToSourceBuilder + .Replace("{entityTypeName}", model.EntityTypeIdentifierName) + .Replace("{returnTypeFullName}", returnTypeFullName) + .Replace("{createTypeFullName}", createTypeFullName) + .Replace("{contextFullName}", contextFullName) + .Replace("{toCreateVarName}", toCreateVarName) + .Replace("{newEntityVarName}", newEntityVarName) + .Replace("{entityTypeFullName}", model.EntityTypeFullName) + .Replace("{propertyName}", propertyName); + + builder + .ParseTemplate(templateToSourceBuilder.ToString()); + } + + if (addSourceTemplate.IsEmpty()) + { + builder + .WriteComment("Generated body") + //.WriteLine(GeneratedFilesHeader) + .WriteLine($"public static (bool, {model.ReturnTypeFullName}) Add{entityTypeName}(") + .WriteLine($"this {contextFullName} dbContext,") + .WriteLine($"{createTypeFullName} {toCreateVarName})") + .WriteOpeningBracket() + .WriteLine($"var {newEntityVarName} = new {model.EntityTypeFullName}({toCreateVarName});") + .WriteLine($"dbContext.{propertyName}.Add({newEntityVarName});") + .WriteLine($"var success = dbContext.SaveChanges() >= 0;") + .WriteLine($"return (success, new {returnTypeFullName}({newEntityVarName}));") + .WriteClosingBracket(); + + builder + .WriteLine(); + } + + return builder; + } + } +} diff --git a/src/BlueWest.MapTo/EfMethods/EfMethodsSource/EfGetOneEntityByTemplate.cs b/src/BlueWest.MapTo/EfMethods/EfMethodsSource/EfGetOneEntityByTemplate.cs new file mode 100644 index 0000000..5ed311f --- /dev/null +++ b/src/BlueWest.MapTo/EfMethods/EfMethodsSource/EfGetOneEntityByTemplate.cs @@ -0,0 +1,63 @@ +using MapTo.Extensions; +using MapTo.Sources; +using System; +using System.Collections.Generic; +using System.Text; + +namespace MapTo +{ + internal static class EfGetOneEntityByTemplate + { + internal static SourceBuilder EfAddGetOneEntityByMethod(this SourceBuilder builder, EfMethodsModel methodsModel, EfGetOneByModel model, string addSourceTemplate) + { + var returnTypeFullName = model.ReturnTypeFullName; + var entityTypeName = model.EntityTypeIdentifierName; + var byParamPropertyName = model.ByParamPropertyName; + var byParamFullType = model.ByParamFullTypeName; + + var contextFullName = methodsModel.ContextFullType; + var byParamVarName = model.ByParamPropertyName.ToCamelCase(); + var findEntityVarName = model.EntityTypeIdentifierName.ToCamelCase(); + var propertyName = model.PropertyName; + + if (!addSourceTemplate.IsEmpty()) + { + var templateToSourceBuilder = new StringBuilder(addSourceTemplate); + templateToSourceBuilder + .Replace("{returnTypeFullName}", returnTypeFullName) + .Replace("{entityTypeName}", entityTypeName) + .Replace("{byParamPropertyName}", byParamPropertyName) + .Replace("{contextFullName}", contextFullName) + .Replace("{contextFullName}", contextFullName) + + .Replace("{byParamFullType}", byParamFullType) + .Replace("{byParamVarName}", byParamVarName) + .Replace("{findEntityVarName}", findEntityVarName) + .Replace("{propertyName}", propertyName); + + builder + .ParseTemplate(templateToSourceBuilder.ToString()); + } + + if (addSourceTemplate.IsEmpty()) + { + builder + .WriteComment("Generated body") + //.WriteLine(GeneratedFilesHeader) + .WriteLine($"public static (bool, {returnTypeFullName}) GetOne{entityTypeName}By{byParamPropertyName} (this {contextFullName} dbContext, {byParamFullType} {byParamVarName})") + .WriteOpeningBracket() + .WriteLine($"var {findEntityVarName} = dbContext.{propertyName}") + .WriteLine($".Where(x => x.{byParamPropertyName} == {byParamVarName})") + .WriteLine($".Select(x => new {returnTypeFullName}(x))") + .WriteLine($".FirstOrDefault();") + .WriteLine($"return ({findEntityVarName} != null, {findEntityVarName});") + .WriteClosingBracket(); + + builder + .WriteLine(); + } + + return builder; + } + } +} diff --git a/src/BlueWest.MapTo/EfMethods/EfMethodsSource/EfUpdateEntityTemplateSource.cs b/src/BlueWest.MapTo/EfMethods/EfMethodsSource/EfUpdateEntityTemplateSource.cs new file mode 100644 index 0000000..c87eae6 --- /dev/null +++ b/src/BlueWest.MapTo/EfMethods/EfMethodsSource/EfUpdateEntityTemplateSource.cs @@ -0,0 +1,62 @@ +using MapTo.Extensions; +using System; +using System.Collections.Generic; +using System.Text; + +namespace MapTo.Sources +{ + internal static class EfUpdateEntityTemplateSource + { + internal static SourceBuilder EfAddUpdateEntityMethod(this SourceBuilder builder, EfMethodsModel methodsModel, EfUpdateMethodsModel model, string updateSourceTemplate) + { + var entityTypeName = model.EntityTypeIdentifierName; + var contextFullName = methodsModel.ContextFullType; + var propertyName = model.PropertyName; + var returnTypeFullName = model.ReturnTypeFullName; + var updateTypeFullName = model.UpdateTypeFullName; + var updateVarName = $"{entityTypeName.ToCamelCase()}ToUpdate"; + var keyPropertyName = model.KeyPropertyName; + var keyTypeFullName = model.KeyFullTypeName; + var existingVarName = entityTypeName.ToCamelCase(); + var keyVarName = entityTypeName.ToCamelCase() + model.KeyPropertyName; + if (!updateSourceTemplate.IsEmpty()) + { + var templateToSourceBuilder = new StringBuilder(updateSourceTemplate); + templateToSourceBuilder + .Replace("{entityTypeName}", entityTypeName) + .Replace("{returnTypeFullName}", returnTypeFullName) + .Replace("{updateTypeFullName}", updateTypeFullName) + .Replace("{updateVarName}", updateVarName) + .Replace("{contextFullName}", contextFullName) + .Replace("{propertyName}", propertyName) + .Replace("{keyTypeFullName}", keyTypeFullName) + .Replace("{keyPropertyName}", keyPropertyName) + .Replace("{keyVarName}", keyVarName) + .Replace("{existingEntityVarName}", existingVarName); + builder + .ParseTemplate(templateToSourceBuilder.ToString()); + } + + if (updateSourceTemplate.IsEmpty()) + { + builder + .WriteComment("Generated body") + .WriteLine($"public static (bool, {returnTypeFullName}) Update{entityTypeName}(") + .WriteLine($"this {contextFullName} dbContext,") + .WriteLine($"{updateTypeFullName} {updateVarName},") + .WriteLine($"{keyTypeFullName} {keyVarName})") + .WriteOpeningBracket() + .WriteLine($"var {existingVarName} = dbContext.{propertyName}.FirstOrDefault(x => x.{keyPropertyName} == {keyVarName});") + .WriteLine($"if ({existingVarName} == null) return (false, null);") + .WriteLine($"var success = dbContext.SaveChanges() >= 0;") + .WriteLine($"return (success, new {returnTypeFullName}({existingVarName}));") + .WriteClosingBracket(); + + builder + .WriteLine(); + } + + return builder; + } + } +} diff --git a/src/BlueWest.MapTo/Models.cs b/src/BlueWest.MapTo/Models.cs index 247778e..d5d3907 100644 --- a/src/BlueWest.MapTo/Models.cs +++ b/src/BlueWest.MapTo/Models.cs @@ -78,34 +78,92 @@ namespace MapTo string Namespace, string ContextTypeName, string ContextFullType, - ImmutableArray MethodsModels, + ImmutableArray MethodsModels, ImmutableArray Usings ); - internal record EfEntityDataModel( - string PropertyName, - string EntityTypeFullName, - string EntityTypeIdentifierName - ); - internal record EfAddMethodsModel( + internal class EfEntityDataModel + { + public string PropertyName { get; set; } + public string EntityTypeFullName { get; set; } + public string EntityTypeIdentifierName { get; set; } - EfEntityDataModel Entity, - string CreateTypeFullName, - string CreateTypeIdentifierName, - string ReturnTypeFullName, - string ReturnTypeIdentifierName - ) : IEfMethodsModel; - internal record EfUpdateMethodsModel( - EfEntityDataModel Entity, - string UpdateTypeFullName, - string UpdateTypeIdentifierName, - string ReturnTypeFullName, - string ReturnTypeIdentifierName, + public EfEntityDataModel(string propertyName, string entityTypeFullName, string entityTypeIdentifierName) + { + PropertyName = propertyName; + EntityTypeFullName = entityTypeFullName; + EntityTypeIdentifierName = entityTypeIdentifierName; + } + } + + + internal class EfAddMethodsModel : EfEntityDataModel + { + public string CreateTypeFullName { get; set; } + public string CreateTypeIdentifierName { get; set; } + public string ReturnTypeFullName { get; set; } + public string ReturnTypeIdentifierName { get; set; } + + public EfAddMethodsModel(EfEntityDataModel entity, string createTypeFullName, + string createTypeIdentifierName, + string returnTypeFullName, + string returnTypeIdentifierName) : base(entity.PropertyName, entity.EntityTypeFullName, entity.EntityTypeIdentifierName) + { + CreateTypeFullName = createTypeFullName; + CreateTypeIdentifierName = createTypeIdentifierName; + ReturnTypeIdentifierName = returnTypeIdentifierName; + ReturnTypeFullName = returnTypeFullName; + } + } + + internal class EfGetOneByModel : EfEntityDataModel + { + public string ByParamPropertyName { get; set; } + public string ByParamFullTypeName { get; set; } + public string ByParamTypeName { get; set; } + public string ReturnTypeIdentifierName { get; set; } + public string ReturnTypeFullName { get; set; } + + + public EfGetOneByModel(EfEntityDataModel entity, string byParamPropertyName, + string byParamFullTypeName, + string returnTypeFullName, + string returnTypeIdentifierName) : base(entity.PropertyName, entity.EntityTypeFullName, entity.EntityTypeIdentifierName) + { + ByParamPropertyName = byParamPropertyName; + ByParamFullTypeName = byParamFullTypeName; + ReturnTypeIdentifierName = returnTypeIdentifierName; + ReturnTypeFullName = returnTypeFullName; + ByParamTypeName = returnTypeFullName; + } + } + + + internal class EfUpdateMethodsModel : EfEntityDataModel + { + public string UpdateTypeFullName; + public string UpdateTypeIdentifierName; + public string ReturnTypeFullName; + public string ReturnTypeIdentifierName; + public string KeyPropertyName; + public string KeyFullTypeName; + public EfUpdateMethodsModel(EfEntityDataModel entity, + string updateTypeFullName, + string updateTypeIdentifierName, + string returnTypeFullName, + string returnTypeIdentifierName, string keyPropertyName, - string keyFullTypeName - ): IEfMethodsModel; - - + string keyFullTypeName) : base(entity.PropertyName, entity.EntityTypeFullName, entity.EntityTypeIdentifierName) + { + UpdateTypeFullName = updateTypeFullName; + UpdateTypeIdentifierName = updateTypeIdentifierName; + ReturnTypeFullName= returnTypeFullName; + ReturnTypeIdentifierName = returnTypeIdentifierName; + KeyPropertyName = keyPropertyName; + KeyFullTypeName = keyFullTypeName; + } + } + internal record SourceGenerationOptions( AccessModifier ConstructorAccessModifier, AccessModifier GeneratedMethodsAccessModifier,