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

5
我们正在将一个巨大的解决方案从4.7.2迁移到.Net Core的最后阶段,但我们还没有准备好迁移到Entity Framework Core,因为我们使用了表格类型层次结构等。我们使用EF Code First。因此,包含我们的DbContext和EF迁移的项目现在正在运行.netstandard2.1,并引用EF 6.4(据说自v6.3起支持.net core)。我了解到,EF工具从v6.2 -> v6.4发生了变化,因此我们传统的创建EF迁移的方式现在在包管理器控制台中会导致以下错误:

add-migration TEST -project Data

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

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

dotnet ef migrations add 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" migrations add TEST --assembly Data

您的目标项目“Data”未引用EntityFramework。该软件包是使Entity Framework Core Tools正常工作所必需的。确保您的目标项目正确,安装该程序包,然后重试。

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

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


你应该在新的控制台应用程序中包含你的上下文,然后它将使用你提供的命令找到你的上下文。 - BenceL
我已经尝试过这个方法,无论是将DB Context作为链接文件还是具体文件添加,结果都是相同的行为。 - Nick H
@NickH,你的链接是针对EF Core cli的,而不是针对EF 6.4的。 - smg
@smg 抱歉 - 你是正确的,尽管我已经尝试使用旧版本的工具,但由于不同的原因失败了! 我已更新问题以反映这一点。 - Nick H
3个回答

6
我知道这是一篇比较老的帖子,但当我遇到同样的问题时,我偶然发现了它,希望我的解决方案能帮助到人们。如果你有一个 .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无法正常工作,因此这些冗长的命令似乎是唯一的方法。如果您仍然遇到问题并且我的解决方案没有帮助到您,请尝试从Package Manager Console运行Update-Database或Add-Migration命令,并添加--verbose标志。这将显示Visual Studio正在运行的确切PowerShell命令,您将能够在脚本中重用它。

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


1
非常感谢!我不得不稍微调整一下才能使其正常工作,主要是让depsfile和runtimeconfig指向我的测试项目,而所有其他dll和目录引用我的数据项目。除此之外,它完美地工作了。 - ZeRemz

4

终于解决了!

首先,似乎尽管我从Microsoft读到的所有内容都说这种项目配置是不可能的,但这种配置是不可能实现的。我将Data项目升级为netcoreapp3.1(这意味着解决方案中的每个其他项目都需要升级!),从而解决了目标和DB上下文位置错误。最终我使用了来自Package Manager Console的以下命令:

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 migrations add Test 命令,但显式运行此精确命令会导致熟悉的错误

Your target project 'Data' doesn't reference EntityFramework. This package is required for the Entity Framework Core Tools to work.

...所以我不知道为什么 add-migration 别名看起来有效!

此外,许多应该与ef 6.4工具配合使用的参数(在此处列出:here),实际上也无法使用(例如,“--connection-string”实际上是“-connectionString”),但幸运的是,以上命令完全有效。简而言之,EF 6.4工具的文档是一团糟。希望这些发现对任何处于同样痛苦的情况的人有用。


有一种方法可以让它读取 app.config 中的连接字符串:https://github.com/dotnet/ef6/issues/1603#issuecomment-704922800 - undefined

0

不必创建一个假项目,你也可以在运行命令时暂时将目标框架更改为 net48netcoreapp3.1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接