From 1945ba45a04396996d285fcca317cd90d1956b14 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 6 Mar 2026 01:53:23 +0000 Subject: [PATCH 1/6] Initial plan From 222075eaccfdeb4d024dfd293cb64167aac6541c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 6 Mar 2026 02:27:54 +0000 Subject: [PATCH 2/6] Avoid hardcoded TFMs: retarget Abstractions and Tasks to NetMinimum, templatize props, fix psm1 and OperationTaskBase Co-authored-by: AndriySvyryd <6539701+AndriySvyryd@users.noreply.github.com> --- .../EFCore.Abstractions.csproj | 2 +- src/EFCore.Tasks/EFCore.Tasks.csproj | 24 +++++++++++++++---- .../Tasks/Internal/OperationTaskBase.cs | 15 ++++++------ ...rosoft.EntityFrameworkCore.Tasks.props.in} | 2 +- .../tools/EntityFrameworkCore.psm1 | 4 ++-- 5 files changed, 32 insertions(+), 15 deletions(-) rename src/EFCore.Tasks/buildTransitive/{Microsoft.EntityFrameworkCore.Tasks.props => Microsoft.EntityFrameworkCore.Tasks.props.in} (95%) diff --git a/src/EFCore.Abstractions/EFCore.Abstractions.csproj b/src/EFCore.Abstractions/EFCore.Abstractions.csproj index 1872b15a402..310247199ff 100644 --- a/src/EFCore.Abstractions/EFCore.Abstractions.csproj +++ b/src/EFCore.Abstractions/EFCore.Abstractions.csproj @@ -2,7 +2,7 @@ Provides abstractions and attributes that are used to configure Entity Framework Core - $(DefaultNetCoreTargetFramework) + $(NetMinimum) 3.6 Microsoft.EntityFrameworkCore.Abstractions Microsoft.EntityFrameworkCore diff --git a/src/EFCore.Tasks/EFCore.Tasks.csproj b/src/EFCore.Tasks/EFCore.Tasks.csproj index 8d91c9a30b7..a55237fe124 100644 --- a/src/EFCore.Tasks/EFCore.Tasks.csproj +++ b/src/EFCore.Tasks/EFCore.Tasks.csproj @@ -1,7 +1,7 @@  - $(NetCurrent);$(NetFrameworkToolCurrent) + $(NetMinimum);$(NetFrameworkToolCurrent) MSBuild tasks for Entity Framework Core projects. Microsoft.EntityFrameworkCore.Tasks Microsoft.EntityFrameworkCore @@ -37,8 +37,10 @@ + @@ -61,6 +63,10 @@ + + + + @@ -70,10 +76,20 @@ - - - + + + + + + + + diff --git a/src/EFCore.Tasks/Tasks/Internal/OperationTaskBase.cs b/src/EFCore.Tasks/Tasks/Internal/OperationTaskBase.cs index ea38e491b56..50ba7929f72 100644 --- a/src/EFCore.Tasks/Tasks/Internal/OperationTaskBase.cs +++ b/src/EFCore.Tasks/Tasks/Internal/OperationTaskBase.cs @@ -198,18 +198,19 @@ protected override string GenerateCommandLineCommands() args.Add(runtimeFrameworkVersion); } -#if NET472 -#elif NET11_0 + var assemblyDir = Path.GetDirectoryName(typeof(OperationTaskBase).Assembly.Location)!; + var packageRoot = Path.Combine(assemblyDir, "..", ".."); +#if NETFRAMEWORK + var toolsTfm = new DirectoryInfo(Path.Combine(packageRoot, "tools")) + .EnumerateDirectories().First().Name; #else -#error Target framework needs to be updated here + var toolsTfm = new DirectoryInfo(assemblyDir).Name; #endif args.Add( Path.Combine( - Path.GetDirectoryName(typeof(OperationTaskBase).Assembly.Location)!, - "..", - "..", + packageRoot, "tools", - "net11.0", + toolsTfm, "ef.dll")); args.AddRange(AdditionalArguments); diff --git a/src/EFCore.Tasks/buildTransitive/Microsoft.EntityFrameworkCore.Tasks.props b/src/EFCore.Tasks/buildTransitive/Microsoft.EntityFrameworkCore.Tasks.props.in similarity index 95% rename from src/EFCore.Tasks/buildTransitive/Microsoft.EntityFrameworkCore.Tasks.props rename to src/EFCore.Tasks/buildTransitive/Microsoft.EntityFrameworkCore.Tasks.props.in index 1d0add9c50e..880917c2dc6 100644 --- a/src/EFCore.Tasks/buildTransitive/Microsoft.EntityFrameworkCore.Tasks.props +++ b/src/EFCore.Tasks/buildTransitive/Microsoft.EntityFrameworkCore.Tasks.props.in @@ -2,7 +2,7 @@ - <_TaskTargetFramework Condition="'$(MSBuildRuntimeType)' == 'Core'">net11.0 + <_TaskTargetFramework Condition="'$(MSBuildRuntimeType)' == 'Core'">${NetMinimum} <_TaskTargetFramework Condition="'$(MSBuildRuntimeType)' != 'Core'">net472 <_EFCustomTasksAssembly>$([MSBuild]::NormalizePath($(MSBuildThisFileDirectory),'..\tasks\$(_TaskTargetFramework)\$(MSBuildThisFileName).dll')) publish diff --git a/src/EFCore.Tools/tools/EntityFrameworkCore.psm1 b/src/EFCore.Tools/tools/EntityFrameworkCore.psm1 index 09ec3ae237e..e928179acea 100644 --- a/src/EFCore.Tools/tools/EntityFrameworkCore.psm1 +++ b/src/EFCore.Tools/tools/EntityFrameworkCore.psm1 @@ -1306,8 +1306,8 @@ function EF($project, $startupProject, $params, $applicationArgs, [switch] $skip $projectAssetsFile = GetCpsProperty $startupProject 'ProjectAssetsFile' $runtimeConfig = Join-Path $targetDir ($startupTargetName + '.runtimeconfig.json') $runtimeFrameworkVersion = GetCpsProperty $startupProject 'RuntimeFrameworkVersion' - # TODO: Remove TFM from the path, issue #37473 - $efPath = Join-Path $PSScriptRoot 'net10.0\any\ef.dll' + $efToolsDir = Get-ChildItem -Path $PSScriptRoot -Directory | Where-Object { $_.Name -like 'net*' } | Select-Object -First 1 + $efPath = Join-Path $efToolsDir.FullName 'any\ef.dll' $dotnetParams = 'exec', '--depsfile', $depsFile From f6d78d0dc5a8d2d182ef8e230363d7cbba15d70e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 6 Mar 2026 02:32:59 +0000 Subject: [PATCH 3/6] Address code review: add null checks and more specific pattern matching Co-authored-by: AndriySvyryd <6539701+AndriySvyryd@users.noreply.github.com> --- src/EFCore.Tasks/Tasks/Internal/OperationTaskBase.cs | 3 ++- src/EFCore.Tools/tools/EntityFrameworkCore.psm1 | 6 +++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/EFCore.Tasks/Tasks/Internal/OperationTaskBase.cs b/src/EFCore.Tasks/Tasks/Internal/OperationTaskBase.cs index 50ba7929f72..8c37302b96a 100644 --- a/src/EFCore.Tasks/Tasks/Internal/OperationTaskBase.cs +++ b/src/EFCore.Tasks/Tasks/Internal/OperationTaskBase.cs @@ -202,7 +202,8 @@ protected override string GenerateCommandLineCommands() var packageRoot = Path.Combine(assemblyDir, "..", ".."); #if NETFRAMEWORK var toolsTfm = new DirectoryInfo(Path.Combine(packageRoot, "tools")) - .EnumerateDirectories().First().Name; + .EnumerateDirectories().FirstOrDefault()?.Name + ?? throw new InvalidOperationException("Could not find the Entity Framework Core tools directory."); #else var toolsTfm = new DirectoryInfo(assemblyDir).Name; #endif diff --git a/src/EFCore.Tools/tools/EntityFrameworkCore.psm1 b/src/EFCore.Tools/tools/EntityFrameworkCore.psm1 index e928179acea..13e838cc6ce 100644 --- a/src/EFCore.Tools/tools/EntityFrameworkCore.psm1 +++ b/src/EFCore.Tools/tools/EntityFrameworkCore.psm1 @@ -1306,7 +1306,11 @@ function EF($project, $startupProject, $params, $applicationArgs, [switch] $skip $projectAssetsFile = GetCpsProperty $startupProject 'ProjectAssetsFile' $runtimeConfig = Join-Path $targetDir ($startupTargetName + '.runtimeconfig.json') $runtimeFrameworkVersion = GetCpsProperty $startupProject 'RuntimeFrameworkVersion' - $efToolsDir = Get-ChildItem -Path $PSScriptRoot -Directory | Where-Object { $_.Name -like 'net*' } | Select-Object -First 1 + $efToolsDir = Get-ChildItem -Path $PSScriptRoot -Directory | Where-Object { $_.Name -match '^net\d' } | Select-Object -First 1 + if (-not $efToolsDir) + { + throw 'Could not find the Entity Framework Core tools directory. Ensure the package is installed correctly.' + } $efPath = Join-Path $efToolsDir.FullName 'any\ef.dll' $dotnetParams = 'exec', '--depsfile', $depsFile From 71abbf29a9c94d42b76688578806bbee9b0d136d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 6 Mar 2026 04:59:49 +0000 Subject: [PATCH 4/6] Simplify: use stable 'net' and 'netframework' directory names instead of templating Co-authored-by: AndriySvyryd <6539701+AndriySvyryd@users.noreply.github.com> --- src/EFCore.Tasks/EFCore.Tasks.csproj | 32 ++++++------------- ...Microsoft.EntityFrameworkCore.Tasks.props} | 4 +-- 2 files changed, 11 insertions(+), 25 deletions(-) rename src/EFCore.Tasks/buildTransitive/{Microsoft.EntityFrameworkCore.Tasks.props.in => Microsoft.EntityFrameworkCore.Tasks.props} (91%) diff --git a/src/EFCore.Tasks/EFCore.Tasks.csproj b/src/EFCore.Tasks/EFCore.Tasks.csproj index a55237fe124..fce97c2727b 100644 --- a/src/EFCore.Tasks/EFCore.Tasks.csproj +++ b/src/EFCore.Tasks/EFCore.Tasks.csproj @@ -11,7 +11,7 @@ true $(MSBuildThisFileDirectory)..\..\rulesets\EFCore.noxmldocs.ruleset $(TargetsForTfmSpecificContentInPackage);AddPackContent - tasks + false @@ -37,10 +37,8 @@ - @@ -63,10 +61,6 @@ - - - - @@ -76,24 +70,16 @@ - - - - - - - - - + + + + + + - - + + diff --git a/src/EFCore.Tasks/buildTransitive/Microsoft.EntityFrameworkCore.Tasks.props.in b/src/EFCore.Tasks/buildTransitive/Microsoft.EntityFrameworkCore.Tasks.props similarity index 91% rename from src/EFCore.Tasks/buildTransitive/Microsoft.EntityFrameworkCore.Tasks.props.in rename to src/EFCore.Tasks/buildTransitive/Microsoft.EntityFrameworkCore.Tasks.props index 880917c2dc6..8e96fccc3ab 100644 --- a/src/EFCore.Tasks/buildTransitive/Microsoft.EntityFrameworkCore.Tasks.props.in +++ b/src/EFCore.Tasks/buildTransitive/Microsoft.EntityFrameworkCore.Tasks.props @@ -2,8 +2,8 @@ - <_TaskTargetFramework Condition="'$(MSBuildRuntimeType)' == 'Core'">${NetMinimum} - <_TaskTargetFramework Condition="'$(MSBuildRuntimeType)' != 'Core'">net472 + <_TaskTargetFramework Condition="'$(MSBuildRuntimeType)' == 'Core'">net + <_TaskTargetFramework Condition="'$(MSBuildRuntimeType)' != 'Core'">netframework <_EFCustomTasksAssembly>$([MSBuild]::NormalizePath($(MSBuildThisFileDirectory),'..\tasks\$(_TaskTargetFramework)\$(MSBuildThisFileName).dll')) publish publish From a89504fe6d187d5d786a8d12aa2cd34197a188f5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 6 Mar 2026 05:18:20 +0000 Subject: [PATCH 5/6] Use stable 'net' directory names in all tool paths: OperationTaskBase, psm1, dotnet-ef Co-authored-by: AndriySvyryd <6539701+AndriySvyryd@users.noreply.github.com> --- .../Tasks/Internal/OperationTaskBase.cs | 15 +++++---------- src/EFCore.Tools/EFCore.Tools.csproj | 6 +++--- src/EFCore.Tools/tools/EntityFrameworkCore.psm1 | 7 +------ src/dotnet-ef/RootCommand.cs | 6 +----- src/dotnet-ef/dotnet-ef.csproj | 7 +++---- 5 files changed, 13 insertions(+), 28 deletions(-) diff --git a/src/EFCore.Tasks/Tasks/Internal/OperationTaskBase.cs b/src/EFCore.Tasks/Tasks/Internal/OperationTaskBase.cs index 8c37302b96a..085ee05530a 100644 --- a/src/EFCore.Tasks/Tasks/Internal/OperationTaskBase.cs +++ b/src/EFCore.Tasks/Tasks/Internal/OperationTaskBase.cs @@ -198,20 +198,15 @@ protected override string GenerateCommandLineCommands() args.Add(runtimeFrameworkVersion); } - var assemblyDir = Path.GetDirectoryName(typeof(OperationTaskBase).Assembly.Location)!; - var packageRoot = Path.Combine(assemblyDir, "..", ".."); -#if NETFRAMEWORK - var toolsTfm = new DirectoryInfo(Path.Combine(packageRoot, "tools")) - .EnumerateDirectories().FirstOrDefault()?.Name - ?? throw new InvalidOperationException("Could not find the Entity Framework Core tools directory."); -#else - var toolsTfm = new DirectoryInfo(assemblyDir).Name; -#endif + var packageRoot = Path.Combine( + Path.GetDirectoryName(typeof(OperationTaskBase).Assembly.Location)!, + "..", + ".."); args.Add( Path.Combine( packageRoot, "tools", - toolsTfm, + "net", "ef.dll")); args.AddRange(AdditionalArguments); diff --git a/src/EFCore.Tools/EFCore.Tools.csproj b/src/EFCore.Tools/EFCore.Tools.csproj index caa33c35568..1f5100b6411 100644 --- a/src/EFCore.Tools/EFCore.Tools.csproj +++ b/src/EFCore.Tools/EFCore.Tools.csproj @@ -50,9 +50,9 @@ Update-Database - - - + + + diff --git a/src/EFCore.Tools/tools/EntityFrameworkCore.psm1 b/src/EFCore.Tools/tools/EntityFrameworkCore.psm1 index 13e838cc6ce..bd3dfc51311 100644 --- a/src/EFCore.Tools/tools/EntityFrameworkCore.psm1 +++ b/src/EFCore.Tools/tools/EntityFrameworkCore.psm1 @@ -1306,12 +1306,7 @@ function EF($project, $startupProject, $params, $applicationArgs, [switch] $skip $projectAssetsFile = GetCpsProperty $startupProject 'ProjectAssetsFile' $runtimeConfig = Join-Path $targetDir ($startupTargetName + '.runtimeconfig.json') $runtimeFrameworkVersion = GetCpsProperty $startupProject 'RuntimeFrameworkVersion' - $efToolsDir = Get-ChildItem -Path $PSScriptRoot -Directory | Where-Object { $_.Name -match '^net\d' } | Select-Object -First 1 - if (-not $efToolsDir) - { - throw 'Could not find the Entity Framework Core tools directory. Ensure the package is installed correctly.' - } - $efPath = Join-Path $efToolsDir.FullName 'any\ef.dll' + $efPath = Join-Path $PSScriptRoot 'net\ef.dll' $dotnetParams = 'exec', '--depsfile', $depsFile diff --git a/src/dotnet-ef/RootCommand.cs b/src/dotnet-ef/RootCommand.cs index fa70430b979..3f053ece357 100644 --- a/src/dotnet-ef/RootCommand.cs +++ b/src/dotnet-ef/RootCommand.cs @@ -150,11 +150,7 @@ protected override int Execute(string[] _) args.Add(startupProject.RuntimeFrameworkVersion); } -#if !NET10_0 -#error Target framework needs to be updated here, as well as in Microsoft.EntityFrameworkCore.Tasks.props and EntityFrameworkCore.psm1 -#endif - // TODO: Remove TFM from the path, issue #37473 - args.Add(Path.Combine(toolsPath, "net10.0", "any", "ef.dll")); + args.Add(Path.Combine(toolsPath, "net", "ef.dll")); } else if (targetFramework.Identifier == ".NETStandard") { diff --git a/src/dotnet-ef/dotnet-ef.csproj b/src/dotnet-ef/dotnet-ef.csproj index 9ca666878d1..3aac33cc088 100644 --- a/src/dotnet-ef/dotnet-ef.csproj +++ b/src/dotnet-ef/dotnet-ef.csproj @@ -69,12 +69,11 @@ - - - - + + + From 3284c66e8fe1463bc921d9dcfdd5e96a6160b69f Mon Sep 17 00:00:00 2001 From: Andriy Svyryd Date: Fri, 6 Mar 2026 16:24:49 -0800 Subject: [PATCH 6/6] Don't remove pdbs --- src/EFCore.Tasks/EFCore.Tasks.csproj | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/EFCore.Tasks/EFCore.Tasks.csproj b/src/EFCore.Tasks/EFCore.Tasks.csproj index fce97c2727b..7a74c476184 100644 --- a/src/EFCore.Tasks/EFCore.Tasks.csproj +++ b/src/EFCore.Tasks/EFCore.Tasks.csproj @@ -87,8 +87,11 @@ TargetPath="/%(TfmSpecificPackageFile.PackagePath)/%(Filename)%(Extension)" TargetFramework="$(TargetFramework)" Condition="'$(IncludeSymbols)' == 'true'" /> - - + +