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

Posted

技术标签:

【中文标题】无法在 .Net Standard 2.1 项目中添加 EF 6.4 迁移【英文标题】:Can't add EF 6.4 migrations in a .Net Standard 2.1 project 【发布时间】:2020-04-17 10:09:26 【问题描述】:

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

添加-迁移测试-项目数据

项目“数据”以框架“.NETStandard”为目标。实体框架包管理器控制台工具不支持此框架。

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

dotnet ef 迁移添加 TEST --project Data --startup-project Data_Startup -c CustomContext

找不到名为“CustomContext”的 DbContext。

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

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

您的目标项目“数据”未引用 EntityFramework。此包是 Entity Framework Core Tools 工作所必需的。确保您的目标项目正确,安装包,然后重试。

...尽管它肯定是安装在 Data 项目中的!

我做错了什么?我实际上需要使用哪个工具?这个项目配置甚至可能吗?

【问题讨论】:

您应该在新的控制台应用程序中包含您的上下文,之后它将使用您提供的命令找到您的上下文。 我已经尝试过了,它会导致相同的行为 - 无论数据库上下文是作为链接文件还是具体文件添加。 @NickH 您的链接适用于 EF Core cli,而不适用于 EF 6.4 @smg 对不起 - 你是对的,虽然我已经尝试使用旧版本的工具但没有成功(出于不同的原因!)。我已更新问题以反映这一点。 【参考方案1】:

我知道这是一篇较旧的帖子,但我在遇到同样问题时偶然发现了它,因此希望我的解决方案能对某人有所帮助。如果您有 .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 不起作用,因此这些长命令似乎是唯一的方法。如果您仍然遇到问题并且我的解决方案没有帮助您,请尝试从包管理器控制台运行 Update-Database 或 Add-Migration 命令并添加 --verbose 标志。这将向您显示 Visual Studio 正在运行的确切 PowerShell 命令,您可以在脚本中重复使用这些命令。

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

【讨论】:

非常非常感谢!我不得不稍微调整一下以使其工作,主要是让 depsfile 和 runtimeconfig 指向我的测试项目,所有其他 dll 和目录都引用我的数据项目。除此之外,它运行良好。【参考方案2】:

终于破解了!

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

add-migration TEST -connectionString "SERVER=(local);DATABASE=xxxx;Integrated Security=true" -connectionProvider "System.Data.SqlClient"

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

您的目标项目“数据”未引用 EntityFramework。此包是 Entity Framework Core Tools 工作所必需的。

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于无法在 .Net Standard 2.1 项目中添加 EF 6.4 迁移的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Rider 中使用 .NET Standard 2.0 Lib 加载 Xamarin Forms 项目

无法在面向 .Net Standard 2.0 的项目中加载 Revit API

带有 Realm 3.4.0 的 .Net Standard 2.0“无法解析引用”Xamarin 表单

如何在 .NET Standard 项目中“添加服务引用”

为啥 .NET 框架项目可以作为参考添加到 .NET Standard 2.0 项目中?

为什么在一个解决方案中混合.Net Standard和.Net Core项目?