From 89cc463f3404bfd4a4d1dd513824542b724fdc57 Mon Sep 17 00:00:00 2001 From: deepchoudhery Date: Wed, 8 Feb 2023 18:25:59 -0800 Subject: [PATCH 1/3] init, not working yet --- eng/Versions.props | 2 +- scripts/install-aspnet-codegenerator.cmd | 2 +- .../IdentityGeneratorTemplateModelBuilder.cs | 7 +--- .../Minimal Api/MinimalApiGenerator.cs | 23 +++++++------ .../Templates/MinimalApi/MinimalApiEf.cshtml | 33 ++++++++++++++----- .../EFValidationUtil.cs | 4 +-- .../SharedConstants.cs | 2 +- 7 files changed, 44 insertions(+), 29 deletions(-) diff --git a/eng/Versions.props b/eng/Versions.props index 4aae56768..ba4cd38b7 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -51,7 +51,7 @@ 7.0.3 - 7.0.3 + 7.0.4 rtm False true diff --git a/scripts/install-aspnet-codegenerator.cmd b/scripts/install-aspnet-codegenerator.cmd index cc0744d58..24cda8927 100644 --- a/scripts/install-aspnet-codegenerator.cmd +++ b/scripts/install-aspnet-codegenerator.cmd @@ -1,4 +1,4 @@ -set VERSION=8.0.0-dev +set VERSION=7.0.4 set DEFAULT_NUPKG_PATH=%userprofile%\.nuget\packages set SRC_DIR=%cd% set NUPKG=artifacts/packages/Debug/Shipping/ diff --git a/src/Scaffolding/VS.Web.CG.Mvc/Identity/IdentityGeneratorTemplateModelBuilder.cs b/src/Scaffolding/VS.Web.CG.Mvc/Identity/IdentityGeneratorTemplateModelBuilder.cs index 35c4e1feb..46dcc10c8 100644 --- a/src/Scaffolding/VS.Web.CG.Mvc/Identity/IdentityGeneratorTemplateModelBuilder.cs +++ b/src/Scaffolding/VS.Web.CG.Mvc/Identity/IdentityGeneratorTemplateModelBuilder.cs @@ -744,14 +744,9 @@ private void ValidateRequiredDependencies() var dependencies = new HashSet() { "Microsoft.AspNetCore.Identity.UI", - "Microsoft.EntityFrameworkCore.Design" + EfConstants.EfToolsPackageName }; - const string EfDesignPackageName = "Microsoft.EntityFrameworkCore.Design"; - var isEFDesignPackagePresent = _projectContext - .PackageDependencies - .Any(package => package.Name.Equals(EfDesignPackageName, StringComparison.OrdinalIgnoreCase)); - var missingPackages = dependencies.Where(d => !_projectContext.PackageDependencies.Any(p => p.Name.Equals(d, StringComparison.OrdinalIgnoreCase))); if (CalledFromCommandline && missingPackages.Any()) { diff --git a/src/Scaffolding/VS.Web.CG.Mvc/Minimal Api/MinimalApiGenerator.cs b/src/Scaffolding/VS.Web.CG.Mvc/Minimal Api/MinimalApiGenerator.cs index 827496a59..653fc75a1 100644 --- a/src/Scaffolding/VS.Web.CG.Mvc/Minimal Api/MinimalApiGenerator.cs +++ b/src/Scaffolding/VS.Web.CG.Mvc/Minimal Api/MinimalApiGenerator.cs @@ -32,7 +32,7 @@ public class MinimalApiGenerator : ICodeGenerator private IModelTypesLocator ModelTypesLocator { get; set; } private IFileSystem FileSystem { get; set; } private IProjectContext ProjectContext { get; set; } - private IEntityFrameworkService EntityFrameworkService { get; set;} + private IEntityFrameworkService EntityFrameworkService { get; set; } private ICodeGeneratorActionsService CodeGeneratorActionsService { get; set; } private Workspace Workspace { get; set; } private ConsoleLogger ConsoleLogger { get; set; } @@ -66,6 +66,7 @@ public MinimalApiGenerator(IApplicationInfo applicationInfo, /// public async Task GenerateCode(MinimalApiGeneratorCommandLineModel model) { + System.Diagnostics.Debugger.Launch(); model.ValidateCommandline(Logger); var namespaceName = NameSpaceUtilities.GetSafeNameSpaceFromPath(model.RelativeFolderPath, AppInfo.ApplicationName); //get model and dbcontext @@ -74,7 +75,9 @@ public async Task GenerateCode(MinimalApiGeneratorCommandLineModel model) EntityFrameworkService, ModelTypesLocator, Logger, - areaName : string.Empty); + areaName: string.Empty); + + var allpops = modelTypeAndContextModel.ContextProcessingResult?.ModelMetadata.Properties; if (!string.IsNullOrEmpty(modelTypeAndContextModel.DbContextFullName) && CalledFromCommandline) { @@ -85,7 +88,7 @@ public async Task GenerateCode(MinimalApiGeneratorCommandLineModel model) { ValidateOpenApiDependencies(ProjectContext.PackageDependencies); } - + var templateModel = new MinimalApiModel(modelTypeAndContextModel.ModelType, modelTypeAndContextModel.DbContextFullName, model.EndpintsClassName) { EndpointsName = model.EndpintsClassName, @@ -116,7 +119,7 @@ public async Task GenerateCode(MinimalApiGeneratorCommandLineModel model) } } //execute CodeGeneratorActionsService.AddFileFromTemplateAsync to add endpoints file. - else + else { //Add endpoints file with endpoints class since it does not exist. ValidateModel(model); @@ -178,7 +181,7 @@ internal async Task AddEndpointsMethod(string membersBlockText, string endpoints { usings.Add("Microsoft.AspNetCore.Http.HttpResults"); } - var endpointsCodeFile = new CodeFile { Usings = usings.ToArray()}; + var endpointsCodeFile = new CodeFile { Usings = usings.ToArray() }; var docBuilder = new DocumentBuilder(docEditor, endpointsCodeFile, ConsoleLogger); var newRoot = docBuilder.AddUsings(new CodeChangeOptions()); var classNode = newRoot.DescendantNodes().FirstOrDefault(node => node is ClassDeclarationSyntax classDeclarationSyntax && classDeclarationSyntax.Identifier.ValueText.Contains(className)); @@ -196,7 +199,7 @@ internal async Task AddEndpointsMethod(string membersBlockText, string endpoints classDeclaration = SyntaxFactory.ClassDeclaration($"{templateModel.ModelType.Name}Endpoints") .WithModifiers(SyntaxFactory.TokenList(SyntaxFactory.Token(SyntaxKind.PublicKeyword), SyntaxFactory.Token(SyntaxKind.StaticKeyword))) .NormalizeWhitespace() - .WithLeadingTrivia(SyntaxFactory.CarriageReturnLineFeed, SyntaxFactory.CarriageReturnLineFeed); + .WithLeadingTrivia(SyntaxFactory.CarriageReturnLineFeed, SyntaxFactory.CarriageReturnLineFeed); } var modifiedClass = classDeclaration.AddMembers( SyntaxFactory.GlobalStatement(SyntaxFactory.ParseStatement(membersBlockText)).WithLeadingTrivia(SyntaxFactory.Tab)); @@ -212,7 +215,7 @@ internal async Task AddEndpointsMethod(string membersBlockText, string endpoints { newRoot = newRoot.ReplaceNode(classNode, modifiedClass); } - + docEditor.ReplaceNode(docRoot, newRoot); var classFileSourceTxt = await docEditor.GetChangedDocument()?.GetTextAsync(); var classFileTxt = classFileSourceTxt?.ToString(); @@ -323,7 +326,7 @@ internal async Task ModifyProgramCs(MinimalApiModel templateModel) newRoot = newRoot?.ReplaceNode(mainMethod.Body, updatedMethod); } } - + if (templateModel.OpenAPI) { var builderVariable = ProjectModifierHelper.GetBuilderVariableIdentifierTransformation(newRoot.Members); @@ -336,7 +339,7 @@ internal async Task ModifyProgramCs(MinimalApiModel templateModel) { filteredChanges = DocumentBuilder.AddLeadingTriviaSpaces(filteredChanges, spaces: 12); var mainMethod = DocumentBuilder.GetMethodFromSyntaxRoot(newRoot, Main); - { + { var updatedMethod = DocumentBuilder.ApplyChangesToMethod(mainMethod.Body, filteredChanges); newRoot = newRoot?.ReplaceNode(mainMethod.Body, updatedMethod); } @@ -390,7 +393,7 @@ private void ValidateOpenApiDependencies(IEnumerable pack string.Format(MessageStrings.InstallPackagesForScaffoldingIdentity, string.Join(",", missingPackages))); } } - + private string GetMinimalApiCodeModifierConfig() { string jsonText = string.Empty; diff --git a/src/Scaffolding/VS.Web.CG.Mvc/Templates/MinimalApi/MinimalApiEf.cshtml b/src/Scaffolding/VS.Web.CG.Mvc/Templates/MinimalApi/MinimalApiEf.cshtml index 635d34f5f..0aeef7d9d 100644 --- a/src/Scaffolding/VS.Web.CG.Mvc/Templates/MinimalApi/MinimalApiEf.cshtml +++ b/src/Scaffolding/VS.Web.CG.Mvc/Templates/MinimalApi/MinimalApiEf.cshtml @@ -13,6 +13,7 @@ string updateModel = $"Update{@modelName}"; string dbContextName = Model.ContextTypeName; var entitySetName = Model.ModelMetadata.EntitySetName; + var entityProperties = Model.ModelMetadata.Properties; var primaryKeyName = Model.ModelMetadata.PrimaryKeys[0].PropertyName; var primaryKeyNameLowerCase = primaryKeyName.ToLowerInvariant(); var primaryKeyShortTypeName = Model.ModelMetadata.PrimaryKeys[0].ShortTypeName; @@ -26,6 +27,7 @@ string typedTaskWithNoContent = Model.UseTypedResults ? $"Task>" : ""; string resultsNotFound = $"{resultsExtension}.NotFound()"; string resultsOkModel = $"{resultsExtension}.Ok(model)"; + string resultsOkEmpty = $"{resultsExtension}.Ok()"; string resultsNoContent = $"{resultsExtension}.NoContent()"; string resultsOkModelVariable = $"{resultsExtension}.Ok({@Model.ModelVariable})"; string createdApiVar = string.Format("$\"{0}/{{{1}.{2}}}\",{3}", @routePrefix, @Model.ModelVariable, @primaryKeyName, @Model.ModelVariable); @@ -76,7 +78,8 @@ public static class @endPointsClassName group.MapGet("/{id}", async @typedTaskWithNotFound (@primaryKeyShortTypeName @primaryKeyNameLowerCase, @dbContextName db) => { - return await db.@findModel + return await db.@findModel.AsNoTracking() + .FirstOrDefaultAsync(model => model.@primaryKeyName == @primaryKeyNameLowerCase) is @modelName model ? @resultsOkModel : @resultsNotFound; @@ -97,6 +100,23 @@ public static class @endPointsClassName group.MapPut("/{id}", async @typedTaskWithNoContent (@primaryKeyShortTypeName @primaryKeyNameLowerCase, @modelName @Model.ModelVariable, @dbContextName db) => { + var affected = await db.@entitySetName + .Where(model => model.@primaryKeyName == @primaryKeyNameLowerCase) + .ExecuteUpdateAsync(setters => setters + .SetProperty(t => t.Title, todo.Title) +@{ + //should be atleast one property (primary key) + foreach(var modelProperty in entityProperties) + { + string modelPropertyName = modelProperty.PropertyName; + string setPropertyString = $".SetProperty(m => m.{modelPropertyName}, {Model.ModelVariable}.{modelPropertyName}"; + @:.SetProperty(@setPropertyString) + } +} + .SetProperty(t => t.IsComplete, todo.IsComplete) + ); + + return affected == 1 ? @resultsOkEmpty : @resultsNotFound; var foundModel = await db.@findModel; if (foundModel is null) @@ -145,14 +165,11 @@ public static class @endPointsClassName group.MapDelete("/{id}", async @typedTaskWithNotFound (@primaryKeyShortTypeName @primaryKeyNameLowerCase, @dbContextName db) => { - if (await db.@findModel is @modelName @Model.ModelVariable) - { - db.@remove; - await db.SaveChangesAsync(); - return @resultsOkModelVariable; - } + var affected = await db.@entitySetName + .Where(model => model.@primaryKeyName == @primaryKeyNameLowerCase) + .ExecuteDeleteAsync(); - return @resultsNotFound; + return affected == 1 ? @resultsOkEmpty : @resultsNotFound; }) @{ builderExtensions = $".WithName(\"{@deleteModel}\")"; diff --git a/src/Shared/Microsoft.DotNet.Scaffolding.Shared/EFValidationUtil.cs b/src/Shared/Microsoft.DotNet.Scaffolding.Shared/EFValidationUtil.cs index bdd8368bb..44d672e63 100644 --- a/src/Shared/Microsoft.DotNet.Scaffolding.Shared/EFValidationUtil.cs +++ b/src/Shared/Microsoft.DotNet.Scaffolding.Shared/EFValidationUtil.cs @@ -13,12 +13,12 @@ internal static class EFValidationUtil internal static void ValidateEFDependencies(IEnumerable dependencies, DbProvider dataContextType) { var isEFDesignPackagePresent = dependencies - .Any(package => package.Name.Equals(EfConstants.EfDesignPackageName, StringComparison.OrdinalIgnoreCase)); + .Any(package => package.Name.Equals(EfConstants.EfToolsPackageName, StringComparison.OrdinalIgnoreCase)); if (!isEFDesignPackagePresent) { throw new InvalidOperationException( - string.Format(MessageStrings.InstallEfPackages, $"{EfConstants.EfDesignPackageName}")); + string.Format(MessageStrings.InstallEfPackages, $"{EfConstants.EfToolsPackageName}")); } if (EfConstants.EfPackagesDict.TryGetValue(dataContextType, out var dbProviderPackageName)) diff --git a/src/Shared/Microsoft.DotNet.Scaffolding.Shared/SharedConstants.cs b/src/Shared/Microsoft.DotNet.Scaffolding.Shared/SharedConstants.cs index 06bb0af79..5a0c6baf4 100644 --- a/src/Shared/Microsoft.DotNet.Scaffolding.Shared/SharedConstants.cs +++ b/src/Shared/Microsoft.DotNet.Scaffolding.Shared/SharedConstants.cs @@ -14,7 +14,7 @@ public static class EfConstants public static string SQLite = DbProvider.SQLite.ToString(); public static string CosmosDb = DbProvider.CosmosDb.ToString(); public static string Postgres = DbProvider.Postgres.ToString(); - public const string EfDesignPackageName = "Microsoft.EntityFrameworkCore.Design"; + public const string EfToolsPackageName = "Microsoft.EntityFrameworkCore.Tools"; public const string SqlServerPackageName = "Microsoft.EntityFrameworkCore.SqlServer"; public const string SqlitePackageName = "Microsoft.EntityFrameworkCore.Sqlite"; public const string CosmosPakcageName = "Microsoft.EntityFrameworkCore.Cosmos"; From b60ed9bbebf8ab0b0fc2c8e6c1a2e39b5f470cc0 Mon Sep 17 00:00:00 2001 From: deepchoudhery Date: Wed, 8 Feb 2023 23:16:42 -0800 Subject: [PATCH 2/3] all changes added, works well --- scripts/install-aspnet-codegenerator.sh | 2 +- .../Minimal Api/MinimalApiGenerator.cs | 1 - .../Templates/MinimalApi/MinimalApiEf.cshtml | 26 +++------- .../MinimalApi/MinimalApiEfNoClass.cshtml | 48 +++++++++++-------- 4 files changed, 35 insertions(+), 42 deletions(-) diff --git a/scripts/install-aspnet-codegenerator.sh b/scripts/install-aspnet-codegenerator.sh index c758f627f..649b57956 100755 --- a/scripts/install-aspnet-codegenerator.sh +++ b/scripts/install-aspnet-codegenerator.sh @@ -1,6 +1,6 @@ #!/bin/bash -VERSION=8.0.0-dev +VERSION=7.0.4 DEFAULT_NUPKG_PATH=~/.nuget/packages SRC_DIR=$(pwd) echo $SRC_DIR diff --git a/src/Scaffolding/VS.Web.CG.Mvc/Minimal Api/MinimalApiGenerator.cs b/src/Scaffolding/VS.Web.CG.Mvc/Minimal Api/MinimalApiGenerator.cs index 653fc75a1..fd1f73b02 100644 --- a/src/Scaffolding/VS.Web.CG.Mvc/Minimal Api/MinimalApiGenerator.cs +++ b/src/Scaffolding/VS.Web.CG.Mvc/Minimal Api/MinimalApiGenerator.cs @@ -66,7 +66,6 @@ public MinimalApiGenerator(IApplicationInfo applicationInfo, /// public async Task GenerateCode(MinimalApiGeneratorCommandLineModel model) { - System.Diagnostics.Debugger.Launch(); model.ValidateCommandline(Logger); var namespaceName = NameSpaceUtilities.GetSafeNameSpaceFromPath(model.RelativeFolderPath, AppInfo.ApplicationName); //get model and dbcontext diff --git a/src/Scaffolding/VS.Web.CG.Mvc/Templates/MinimalApi/MinimalApiEf.cshtml b/src/Scaffolding/VS.Web.CG.Mvc/Templates/MinimalApi/MinimalApiEf.cshtml index 0aeef7d9d..2b2b3fc2a 100644 --- a/src/Scaffolding/VS.Web.CG.Mvc/Templates/MinimalApi/MinimalApiEf.cshtml +++ b/src/Scaffolding/VS.Web.CG.Mvc/Templates/MinimalApi/MinimalApiEf.cshtml @@ -13,6 +13,7 @@ string updateModel = $"Update{@modelName}"; string dbContextName = Model.ContextTypeName; var entitySetName = Model.ModelMetadata.EntitySetName; + var entitySetNoTracking = $"{entitySetName}.AsNoTracking()"; var entityProperties = Model.ModelMetadata.Properties; var primaryKeyName = Model.ModelMetadata.PrimaryKeys[0].PropertyName; var primaryKeyNameLowerCase = primaryKeyName.ToLowerInvariant(); @@ -24,7 +25,7 @@ var remove = $"{@entitySetName}.Remove({@Model.ModelVariable})"; string resultsExtension = Model.UseTypedResults ? "TypedResults" : "Results"; string typedTaskWithNotFound = Model.UseTypedResults ? $"Task, NotFound>>" : ""; - string typedTaskWithNoContent = Model.UseTypedResults ? $"Task>" : ""; + string typedTaskOkNotFound = Model.UseTypedResults ? $"Task>" : ""; string resultsNotFound = $"{resultsExtension}.NotFound()"; string resultsOkModel = $"{resultsExtension}.Ok(model)"; string resultsOkEmpty = $"{resultsExtension}.Ok()"; @@ -78,7 +79,7 @@ public static class @endPointsClassName group.MapGet("/{id}", async @typedTaskWithNotFound (@primaryKeyShortTypeName @primaryKeyNameLowerCase, @dbContextName db) => { - return await db.@findModel.AsNoTracking() + return await db.@entitySetNoTracking .FirstOrDefaultAsync(model => model.@primaryKeyName == @primaryKeyNameLowerCase) is @modelName model ? @resultsOkModel @@ -98,36 +99,23 @@ public static class @endPointsClassName @:@builderExtensions; } - group.MapPut("/{id}", async @typedTaskWithNoContent (@primaryKeyShortTypeName @primaryKeyNameLowerCase, @modelName @Model.ModelVariable, @dbContextName db) => + group.MapPut("/{id}", async @typedTaskOkNotFound (@primaryKeyShortTypeName @primaryKeyNameLowerCase, @modelName @Model.ModelVariable, @dbContextName db) => { var affected = await db.@entitySetName .Where(model => model.@primaryKeyName == @primaryKeyNameLowerCase) .ExecuteUpdateAsync(setters => setters - .SetProperty(t => t.Title, todo.Title) @{ //should be atleast one property (primary key) foreach(var modelProperty in entityProperties) { string modelPropertyName = modelProperty.PropertyName; - string setPropertyString = $".SetProperty(m => m.{modelPropertyName}, {Model.ModelVariable}.{modelPropertyName}"; - @:.SetProperty(@setPropertyString) + string setPropertyString = $".SetProperty(m => m.{modelPropertyName}, {Model.ModelVariable}.{modelPropertyName})"; + @:@setPropertyString } } - .SetProperty(t => t.IsComplete, todo.IsComplete) ); return affected == 1 ? @resultsOkEmpty : @resultsNotFound; - var foundModel = await db.@findModel; - - if (foundModel is null) - { - return @resultsNotFound; - } - - db.Update(@Model.ModelVariable); - await db.SaveChangesAsync(); - - return @resultsNoContent; }) @{ builderExtensions = $".WithName(\"{@updateModel}\")"; @@ -163,7 +151,7 @@ public static class @endPointsClassName @:@builderExtensions; } - group.MapDelete("/{id}", async @typedTaskWithNotFound (@primaryKeyShortTypeName @primaryKeyNameLowerCase, @dbContextName db) => + group.MapDelete("/{id}", async @typedTaskOkNotFound (@primaryKeyShortTypeName @primaryKeyNameLowerCase, @dbContextName db) => { var affected = await db.@entitySetName .Where(model => model.@primaryKeyName == @primaryKeyNameLowerCase) diff --git a/src/Scaffolding/VS.Web.CG.Mvc/Templates/MinimalApi/MinimalApiEfNoClass.cshtml b/src/Scaffolding/VS.Web.CG.Mvc/Templates/MinimalApi/MinimalApiEfNoClass.cshtml index ce7b352db..25207ada6 100644 --- a/src/Scaffolding/VS.Web.CG.Mvc/Templates/MinimalApi/MinimalApiEfNoClass.cshtml +++ b/src/Scaffolding/VS.Web.CG.Mvc/Templates/MinimalApi/MinimalApiEfNoClass.cshtml @@ -3,6 +3,7 @@ string modelName = Model.ModelType.Name; string routePrefix = "/api/" + modelName; string endPointsClassName = Model.EndpointsName; + string methodName = $"Map{@modelName}Endpoints"; string pluralModel = $"{@modelName}s"; string getAllModels = $"GetAll{@pluralModel}"; string getModelById = $"Get{@modelName}ById"; @@ -11,6 +12,8 @@ string updateModel = $"Update{@modelName}"; string dbContextName = Model.ContextTypeName; var entitySetName = Model.ModelMetadata.EntitySetName; + var entitySetNoTracking = $"{entitySetName}.AsNoTracking()"; + var entityProperties = Model.ModelMetadata.Properties; var primaryKeyName = Model.ModelMetadata.PrimaryKeys[0].PropertyName; var primaryKeyNameLowerCase = primaryKeyName.ToLowerInvariant(); var primaryKeyShortTypeName = Model.ModelMetadata.PrimaryKeys[0].ShortTypeName; @@ -22,9 +25,10 @@ var remove = $"{@entitySetName}.Remove({@Model.ModelVariable})"; string resultsExtension = Model.UseTypedResults ? "TypedResults" : "Results"; string typedTaskWithNotFound = Model.UseTypedResults ? $"Task, NotFound>>" : ""; - string typedTaskWithNoContent = Model.UseTypedResults ? $"Task>" : ""; + string typedTaskOkNotFound = Model.UseTypedResults ? $"Task>" : ""; string resultsNotFound = $"{resultsExtension}.NotFound()"; string resultsOkModel = $"{resultsExtension}.Ok(model)"; + string resultsOkEmpty = $"{resultsExtension}.Ok()"; string resultsNoContent = $"{resultsExtension}.NoContent()"; string resultsOkModelVariable = $"{resultsExtension}.Ok({@Model.ModelVariable})"; string createdApiVar = string.Format("$\"{0}/{{{1}.{2}}}\",{3}", @routePrefix, @Model.ModelVariable, @primaryKeyName, @Model.ModelVariable); @@ -64,7 +68,8 @@ group.MapGet("/{id}", async @typedTaskWithNotFound (@primaryKeyShortTypeName @primaryKeyNameLowerCase, @dbContextName db) => { - return await db.@findModel + return await db.@entitySetNoTracking + .FirstOrDefaultAsync(model => model.@primaryKeyName == @primaryKeyNameLowerCase) is @modelName model ? @resultsOkModel : @resultsNotFound; @@ -83,19 +88,23 @@ @:@builderExtensions; } - group.MapPut("/{id}", async @typedTaskWithNoContent (@primaryKeyShortTypeName @primaryKeyNameLowerCase, @modelName @Model.ModelVariable, @dbContextName db) => + group.MapPut("/{id}", async @typedTaskOkNotFound (@primaryKeyShortTypeName @primaryKeyNameLowerCase, @modelName @Model.ModelVariable, @dbContextName db) => { - var foundModel = await db.@findModel; - - if (foundModel is null) - { - return @resultsNotFound; - } - - db.Update(@Model.ModelVariable); - await db.SaveChangesAsync(); + var affected = await db.@entitySetName + .Where(model => model.@primaryKeyName == @primaryKeyNameLowerCase) + .ExecuteUpdateAsync(setters => setters +@{ + //should be atleast one property (primary key) + foreach(var modelProperty in entityProperties) + { + string modelPropertyName = modelProperty.PropertyName; + string setPropertyString = $".SetProperty(m => m.{modelPropertyName}, {Model.ModelVariable}.{modelPropertyName})"; + @:@setPropertyString + } +} + ); - return @resultsNoContent; + return affected == 1 ? @resultsOkEmpty : @resultsNotFound; }) @{ builderExtensions = $".WithName(\"{@updateModel}\")"; @@ -131,16 +140,13 @@ @:@builderExtensions; } - group.MapDelete("/{id}", async @typedTaskWithNotFound (@primaryKeyShortTypeName @primaryKeyNameLowerCase, @dbContextName db) => + group.MapDelete("/{id}", async @typedTaskOkNotFound (@primaryKeyShortTypeName @primaryKeyNameLowerCase, @dbContextName db) => { - if (await db.@findModel is @modelName @Model.ModelVariable) - { - db.@remove; - await db.SaveChangesAsync(); - return @resultsOkModelVariable; - } + var affected = await db.@entitySetName + .Where(model => model.@primaryKeyName == @primaryKeyNameLowerCase) + .ExecuteDeleteAsync(); - return @resultsNotFound; + return affected == 1 ? @resultsOkEmpty : @resultsNotFound; }) @{ builderExtensions = $".WithName(\"{@deleteModel}\")"; From f6761af7134b418eb4c82c163ef9b644aed2b0aa Mon Sep 17 00:00:00 2001 From: deepchoudhery Date: Thu, 9 Feb 2023 11:41:48 -0800 Subject: [PATCH 3/3] nit, removed unused statement. --- .../VS.Web.CG.Mvc/Minimal Api/MinimalApiGenerator.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Scaffolding/VS.Web.CG.Mvc/Minimal Api/MinimalApiGenerator.cs b/src/Scaffolding/VS.Web.CG.Mvc/Minimal Api/MinimalApiGenerator.cs index fd1f73b02..6315b44ea 100644 --- a/src/Scaffolding/VS.Web.CG.Mvc/Minimal Api/MinimalApiGenerator.cs +++ b/src/Scaffolding/VS.Web.CG.Mvc/Minimal Api/MinimalApiGenerator.cs @@ -76,8 +76,6 @@ public async Task GenerateCode(MinimalApiGeneratorCommandLineModel model) Logger, areaName: string.Empty); - var allpops = modelTypeAndContextModel.ContextProcessingResult?.ModelMetadata.Properties; - if (!string.IsNullOrEmpty(modelTypeAndContextModel.DbContextFullName) && CalledFromCommandline) { EFValidationUtil.ValidateEFDependencies(ProjectContext.PackageDependencies, model.DatabaseProvider);