Get one template working
This commit is contained in:
parent
9743ff3740
commit
32bf670b9e
|
@ -272,31 +272,39 @@ namespace MapTo
|
||||||
var addAttributeSymbols = GetAllowedMemberSyntaxes(EfAddMethodsAttributeSource.AttributeName);
|
var addAttributeSymbols = GetAllowedMemberSyntaxes(EfAddMethodsAttributeSource.AttributeName);
|
||||||
|
|
||||||
var updateAttributesMembers = GetAllowedMemberSyntaxes(EfUpdateMethodsAttributeSource.AttributeName);
|
var updateAttributesMembers = GetAllowedMemberSyntaxes(EfUpdateMethodsAttributeSource.AttributeName);
|
||||||
|
|
||||||
|
var getOneAttributesMembers = GetAllowedMemberSyntaxes(EfGetOneByAttributeSource.AttributeName);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
List<IEfMethodsModel> methodsModels = new List<IEfMethodsModel>();
|
List<EfEntityDataModel> methodsModels = new List<EfEntityDataModel>();
|
||||||
|
|
||||||
foreach (var uProperty in updateAttributesMembers)
|
foreach (var uProperty in getOneAttributesMembers)
|
||||||
{
|
{
|
||||||
|
var newUpdateModel = ExtractEfGetEntityByModel(semanticModel, uProperty);
|
||||||
var newUpdateModel = ExtractEfUpdateMethodsModel(semanticModel, uProperty);
|
|
||||||
methodsModels.Add(newUpdateModel);
|
methodsModels.Add(newUpdateModel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
foreach (var uProperty in addAttributeSymbols)
|
foreach (var uProperty in addAttributeSymbols)
|
||||||
{
|
{
|
||||||
var entityTypeData = GetEntityTypeData(uProperty, semanticModel);
|
var entityTypeData = GetEntityTypeData(uProperty, semanticModel);
|
||||||
string entityIdentifierName = entityTypeData.Name;
|
string entityIdentifierName = entityTypeData.Name;
|
||||||
string entityFullName = entityTypeData.ToDisplayString();
|
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 entityDataModel = new EfEntityDataModel(propertyNamex, entityFullName, entityIdentifierName);
|
||||||
var newAddModel = ExtractEfAddMethodsModel(semanticModel, uProperty, entityDataModel);
|
var newAddModel = ExtractEfAddMethodsModel(semanticModel, uProperty, entityDataModel);
|
||||||
methodsModels.Add(newAddModel);
|
methodsModels.Add(newAddModel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach (var uProperty in updateAttributesMembers)
|
||||||
|
{
|
||||||
|
var newUpdateModel = ExtractEfUpdateMethodsModel(semanticModel, uProperty);
|
||||||
|
methodsModels.Add(newUpdateModel);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//SpinWait.SpinUntil(() => Debugger.IsAttached);
|
//SpinWait.SpinUntil(() => Debugger.IsAttached);
|
||||||
|
|
||||||
return new EfMethodsModel(
|
return new EfMethodsModel(
|
||||||
|
@ -390,6 +398,55 @@ namespace MapTo
|
||||||
return new EfUpdateMethodsModel(entityDataModel, updateTypeFullName, updateTypeIdentifierName, returnTypeFullName,
|
return new EfUpdateMethodsModel(entityDataModel, updateTypeFullName, updateTypeIdentifierName, returnTypeFullName,
|
||||||
returnTypeIdentifierName, keyPropertyName, keyMemberFullName);
|
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<IPropertySymbol> GetSymbolsFromAttribute(ITypeSymbol typeSymbol, INamedTypeSymbol attributeTypeSymbol)
|
protected ImmutableArray<IPropertySymbol> GetSymbolsFromAttribute(ITypeSymbol typeSymbol, INamedTypeSymbol attributeTypeSymbol)
|
||||||
|
|
|
@ -68,7 +68,7 @@ namespace MapTo
|
||||||
|
|
||||||
var (source, hintName) = candidateMember switch
|
var (source, hintName) = candidateMember switch
|
||||||
{
|
{
|
||||||
ClassDeclarationSyntax => EfMethodsSource.Generate(mappingContext.Model, addSourceTemplate, updateSourceTemplate),
|
ClassDeclarationSyntax => EfMethodsSource.Generate(mappingContext.Model, addSourceTemplate, updateSourceTemplate, getOneByTemplate),
|
||||||
_ => throw new ArgumentOutOfRangeException()
|
_ => throw new ArgumentOutOfRangeException()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ namespace MapTo.Sources
|
||||||
{
|
{
|
||||||
internal static class EfMethodsSource
|
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();
|
using var builder = new SourceBuilder();
|
||||||
|
|
||||||
|
@ -35,7 +35,8 @@ namespace MapTo.Sources
|
||||||
.WriteOpeningBracket()
|
.WriteOpeningBracket()
|
||||||
.WriteLine();
|
.WriteLine();
|
||||||
|
|
||||||
foreach (var methodModel in model.MethodsModels)
|
|
||||||
|
foreach (var methodModel in model.MethodsModels.OrderBy(x => x.PropertyName))
|
||||||
{
|
{
|
||||||
if (methodModel is EfAddMethodsModel m)
|
if (methodModel is EfAddMethodsModel m)
|
||||||
{
|
{
|
||||||
|
@ -52,6 +53,14 @@ namespace MapTo.Sources
|
||||||
.WriteLine();
|
.WriteLine();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (methodModel is EfGetOneByModel getOneByModel)
|
||||||
|
{
|
||||||
|
builder
|
||||||
|
.EfAddGetOneEntityByMethod(model, getOneByModel, getOneBySourceTemplate)
|
||||||
|
.WriteLine();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -67,7 +76,7 @@ namespace MapTo.Sources
|
||||||
return new(generatedCode, hintName);
|
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);
|
string[] array = finalTemplate.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
|
||||||
|
|
||||||
|
@ -80,107 +89,7 @@ namespace MapTo.Sources
|
||||||
return builder;
|
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -78,34 +78,92 @@ namespace MapTo
|
||||||
string Namespace,
|
string Namespace,
|
||||||
string ContextTypeName,
|
string ContextTypeName,
|
||||||
string ContextFullType,
|
string ContextFullType,
|
||||||
ImmutableArray<IEfMethodsModel> MethodsModels,
|
ImmutableArray<EfEntityDataModel> MethodsModels,
|
||||||
ImmutableArray<string> Usings
|
ImmutableArray<string> Usings
|
||||||
);
|
);
|
||||||
|
|
||||||
internal record EfEntityDataModel(
|
internal class EfEntityDataModel
|
||||||
string PropertyName,
|
{
|
||||||
string EntityTypeFullName,
|
public string PropertyName { get; set; }
|
||||||
string EntityTypeIdentifierName
|
public string EntityTypeFullName { get; set; }
|
||||||
);
|
public string EntityTypeIdentifierName { get; set; }
|
||||||
internal record EfAddMethodsModel(
|
|
||||||
|
|
||||||
EfEntityDataModel Entity,
|
public EfEntityDataModel(string propertyName, string entityTypeFullName, string entityTypeIdentifierName)
|
||||||
string CreateTypeFullName,
|
{
|
||||||
string CreateTypeIdentifierName,
|
PropertyName = propertyName;
|
||||||
string ReturnTypeFullName,
|
EntityTypeFullName = entityTypeFullName;
|
||||||
string ReturnTypeIdentifierName
|
EntityTypeIdentifierName = entityTypeIdentifierName;
|
||||||
) : IEfMethodsModel;
|
}
|
||||||
internal record EfUpdateMethodsModel(
|
}
|
||||||
EfEntityDataModel Entity,
|
|
||||||
string UpdateTypeFullName,
|
|
||||||
string UpdateTypeIdentifierName,
|
internal class EfAddMethodsModel : EfEntityDataModel
|
||||||
string ReturnTypeFullName,
|
{
|
||||||
string ReturnTypeIdentifierName,
|
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 keyPropertyName,
|
||||||
string keyFullTypeName
|
string keyFullTypeName) : base(entity.PropertyName, entity.EntityTypeFullName, entity.EntityTypeIdentifierName)
|
||||||
): IEfMethodsModel;
|
{
|
||||||
|
UpdateTypeFullName = updateTypeFullName;
|
||||||
|
UpdateTypeIdentifierName = updateTypeIdentifierName;
|
||||||
|
ReturnTypeFullName= returnTypeFullName;
|
||||||
|
ReturnTypeIdentifierName = returnTypeIdentifierName;
|
||||||
|
KeyPropertyName = keyPropertyName;
|
||||||
|
KeyFullTypeName = keyFullTypeName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
internal record SourceGenerationOptions(
|
internal record SourceGenerationOptions(
|
||||||
AccessModifier ConstructorAccessModifier,
|
AccessModifier ConstructorAccessModifier,
|
||||||
AccessModifier GeneratedMethodsAccessModifier,
|
AccessModifier GeneratedMethodsAccessModifier,
|
||||||
|
|
Loading…
Reference in New Issue