Nic*_*k H 5 c# entity-framework entity-framework-6 entity-framework-migrations
我们正处于将大型解决方案移植到 .Net Core(从 4.7.2 开始)的最后阶段,但我们还没有准备好迁移到 Entity Framework Core,因为我们使用每个类型的表层次结构,等等。我们使用 EF 代码优先。因此,包含 DbContext 和 EF 迁移的项目现在正在运行 .netstandard2.1 并引用 EF 6.4(从 v6.3 开始,它显然支持 .net core)。据我了解,EF 工具从 v6.2 更改为 v6.4,因此我们创建 EF 迁移的传统方法现在会在程序包管理器控制台中导致以下错误:
添加迁移测试-项目数据
项目“数据”目标框架“.NETStandard”。实体框架包管理器控制台工具不支持此框架。
经过一番调查,我发现了这个,这表明您需要使用 .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。实体框架核心工具需要此包才能正常工作。确保您的目标项目正确,安装包,然后重试。
...尽管它肯定安装在数据项目中!
我究竟做错了什么?我实际上需要使用哪个工具?这个项目配置是否可能?
我知道这是一篇较旧的帖子,但我在遇到同样的问题时偶然发现了它,所以希望我的解决方案能够帮助别人。如果您有 .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"
Run Code Online (Sandbox Code Playgroud)
运行迁移:
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"
Run Code Online (Sandbox Code Playgroud)
由于像在 .NET Framework 中那样直接使用 ef6.exe 不起作用,这些长命令似乎是唯一的方法。如果您仍然遇到问题并且我的解决方案没有帮助您,请尝试从包管理器控制台运行 Update-Database 或 Add-Migration 命令并添加 --verbose 标志。这将向您显示 Visual Studio 正在运行的确切 PowerShell 命令,您可以在脚本中重用该命令。
此外,您可以让它读取您的 App.Config 文件,但由于某种原因 --configuration 参数被忽略。它始终使用需要存在于程序集目录中的 ef6.dll.config 文件。您可以将构建配置设置为始终将 App.config 文件复制到 ef6.dll.config
终于破解了!
首先,尽管我从微软读到了所有内容,但这个项目配置似乎是不可能的。我将数据项目升级到 netcoreapp3.1(意味着升级到解决方案中的所有其他项目!),这解决了定位和数据库上下文位置错误。我最终在包管理器控制台中使用了以下命令:
添加迁移测试 -connectionString“SERVER =(本地);DATABASE = xxxx;集成安全性= true” -connectionProvider“System.Data.SqlClient”
有趣的是,使用verbose标志运行上述命令表明它实际上正在运行我最初尝试的命令之一:dotnet C:\Users\xxxx.nuget\packages\entityframework\6.4.0\tools\netcoreapp3.0\any\ef6 .dll 迁移添加测试命令,但显式运行此确切命令失败并出现熟悉的错误
您的目标项目“数据”不引用EntityFramework。实体框架核心工具需要此包才能正常工作。
...所以我不知道为什么add-migration别名似乎有效!
此外,许多应该与 ef 6.4 工具一起使用的参数(此处列出)实际上也不起作用(例如“--connection-string”实际上是“-connectionString”),但幸运的是上面的命令可以完美地工作。简而言之,EF 6.4 工具的文档绝对是一团糟。希望这些发现对处于同样令人痛苦沮丧情况的其他人有用。
| 归档时间: |
|
| 查看次数: |
2421 次 |
| 最近记录: |