无法在 .Net Standard 2.1 项目中添加 EF 6.4 迁移

Can't add EF 6.4 migrations in a .Net Standard 2.1 project

我们正处于将一个巨大的解决方案移植到 .Net Core(从 4.7.2 开始)的最后阶段,但我们还没有准备好迁移到 Entity Framework Core,因为我们使用table-per-type 层次结构等。我们使用 EF 代码优先。因此,包含我们的 DbContext 和 EF 迁移的项目现在是 运行 .netstandard2.1 并引用 EF 6.4(从 v6.3 开始显然支持 .net 核心)。我了解到 EF 工具从 v6.2 -> v6.4 发生了变化,因此我们创建 EF 迁移的传统方法现在会导致程序包管理器控制台中出现以下错误:

添加迁移测试-项目数据

项目 'Data' 目标框架“.NETStandard”。 Entity Framework 程序包管理器控制台工具不支持此框架。

经过一些调查,我遇到了 this,这表明您需要使用 .Net Core 程序集作为虚拟启动项目。创建 .netcore 3.1 控制台应用程序项目(称为 Data_Startup,它引用数据项目)并稍微修改我的命令后,我现在收到以下错误:

dotnet ef migrations add TEST --project Data --startup-project Data_Startup -c CustomContext

未找到名为 'CustomContext' 的 DbContext。

这似乎至少是在尝试迁移,但我现在卡住了。我已经尝试使用命名空间完全限定 DbContext,并将 DBContext class 作为 "linked file" 添加到新的虚拟项目中,但我遇到了同样的错误。

我也尝试过使用 EF 6.4 工具: dotnet C:\Users\xxxx.nuget\packages\entityframework.4.0\tools\netcoreapp3.0\any\ef6.dll" migrations add TEST --assembly Data

您的目标项目 'Data' 没有引用 EntityFramework。 Entity Framework 核心工具需要此包才能工作。确保你的目标项目是正确的,安装包,然后重试。

...尽管它确实安装在数据项目中!

我做错了什么?我实际上需要使用哪个工具?这个项目配置是否可行?

终于破解了!

首先,尽管我从 Microsoft 读到了所有内容,但这个项目配置似乎不可能。我将数据项目升级到 netcoreapp3.1(意味着升级到解决方案中的所有其他项目!),这解决了定位和数据库上下文位置错误。我最终从包管理器控制台使用了以下命令:

添加迁移测试-connectionString "SERVER=(local);DATABASE=xxxx;Integrated Security=true"-connectionProvider "System.Data.SqlClient"

有趣的是,运行 上面的 verbose 标志表明它实际上是 运行 我最初尝试的命令之一:dotnet C:\Users\xxxx.nuget\packages\entityframework.4.0\tools\netcoreapp3.0\any\ef6.dll 迁移添加 Test 命令,但明确 运行 这个确切命令失败并出现熟悉的错误

您的目标项目 'Data' 没有引用 EntityFramework。 Entity Framework 核心工具需要此包才能工作。

...所以我不知道为什么 add-migration 别名似乎有效!

此外,许多应该与 ef 6.4 工具一起使用的参数(列出 here)实际上也不起作用(例如“--connection-string”实际上是“-connectionString” ), 但值得庆幸的是,上面的命令工作得很好。简而言之,EF 6.4 工具的文档绝对是一团糟。希望这些发现对处于同样痛苦沮丧情况的任何其他人都有用。

除了创建一个虚拟项目,您还可以暂时将目标框架更改为 net48netcoreapp3.1,同时 运行 命令。

我知道这是一个较旧的 post,但我在遇到同样的问题时偶然发现了它,所以希望我的解决方案能对某人有所帮助。如果您有 .NET 5 或 .NET Core 项目并且在其中使用了 EF6,下面是 运行 从 PowerShell 迁移的方法:

添加迁移:

cd "your_solution_directory"
$assemblyDirectory = "Test.Project\bin\Debug\net5.0-windows"

& dotnet exec --depsfile "$assemblyDirectory\Test.Project.deps.json" --runtimeconfig "$assemblyDirectory\Test.Project.runtimeconfig.json" packages\EntityFramework.6.4.4\tools\netcoreapp3.0\any\ef6.dll migrations add TestMigrationName --json --verbose --no-color --prefix-output --assembly "$assemblyDirectory\Test.Project.dll" --project-dir Test.Project\ --root-namespace Test.Project --connection-string "Data Source=(LocalDB)\MSSQLLocalDB;Initial Catalog=DBNAME;Integrated Security=True" --connection-provider "System.Data.SqlClient"

运行 迁移:

cd "your_solution_directory"
$assemblyDirectory = "Test.Project\bin\Debug\net5.0-windows"

& dotnet exec --depsfile "$assemblyDirectory\Test.Project.deps.json" --runtimeconfig "$assemblyDirectory\Test.Project.runtimeconfig.json" packages\EntityFramework.6.4.4\tools\netcoreapp3.0\any\ef6.dll database update --target TARGET_MIGRATION_NAME_HERE --verbose --no-color --prefix-output --assembly "$assemblyDirectory\Test.Project.dll" --project-dir Test.Project\ --language C# --root-namespace Test.Project --connection-string "Data Source=(LocalDB)\MSSQLLocalDB;Initial Catalog=DBNAME;Integrated Security=True" --connection-provider "System.Data.SqlClient"

因为像在 .NET Framework 中那样直接使用 ef6.exe 不起作用,所以这些长命令似乎是唯一的方法。如果您仍然遇到问题并且我的解决方案对您没有帮助,请尝试从程序包管理器控制台使用 运行ning Update-Database 或 Add-Migration 命令并添加 --verbose 标志。这将向您显示 Visual Studio 运行 的确切 PowerShell 命令,您将能够在脚本中重复使用该命令。

此外,您可以让它读取您的 App.Config 文件,但由于某些原因,--configuration 参数会被忽略。它总是使用需要存在于程序集目录中的 ef6.dll.config 文件。您可以将构建配置设置为始终将 App.config 文件复制到 ef6.dll.config