EF Core+OracleDB初始迁移时无法创建DbContext的问题
Oracle EF Core迁移报错:get_LockReleaseBehavior方法未实现
问题场景
在基于OracleDB的全新EF Core解决方案中执行首次迁移,运行JetBrains Rider自动生成的命令:
"C:\Program Files\dotnet\dotnet.exe" ef migrations add --project IS.Terminals.VGM.Infrastructure\IS.Terminals.VGM.Infrastructure.csproj --startup-project IS.Terminals.VGM\IS.Terminals.VGM.csproj --context IS.Terminals.VGM.VGMContext --configuration Debug --verbose Initial --output-dir Migrations
触发错误:
Unable to create a 'DbContext' of type 'IS.Terminals.VGM.VGMContext'. The exception 'Method 'get_LockReleaseBehavior' in type 'Oracle.EntityFrameworkCore.Migrations.Internal.OracleHistoryRepository' from assembly 'Oracle.EntityFrameworkCore, Version=8.0.23.1, Culture=neutral, PublicKeyToken=89b483f429c47342' does not have an implementation.' was thrown while attempting to create an instance. For the different patterns supported at design time, see https://go.microsoft.com/fwlink/?linkid=851728
已做排查
- 未找到
get_LockReleaseBehavior方法的相关公开信息 - 错误提示加载的Oracle.EntityFrameworkCore版本为8.0.23.1,但项目.csproj中配置的是8.23.60版本
- 执行
dotnet nuget locals all --clear清理NuGet缓存,无效 - 存在一个可正常执行迁移的参考解决方案
- 怀疑是包版本冲突,但暂未找到解决路径
可行解决步骤
1. 定位依赖版本冲突源
- 打开解决方案的NuGet包管理界面,查看所有项目中Oracle.EntityFrameworkCore的实际安装版本,确认是否有间接依赖引入了8.0.23.1版本
- 执行命令列出所有直接/间接依赖,定位低版本包的来源:
dotnet list package --include-transitive
2. 强制统一Oracle包版本
- 在解决方案根目录创建或修改
Directory.Packages.props文件,全局指定Oracle.EntityFrameworkCore版本为8.23.60,确保所有项目统一使用该版本:<Project> <PropertyGroup> <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally> </PropertyGroup> <ItemGroup> <PackageVersion Include="Oracle.EntityFrameworkCore" Version="8.23.60" /> </ItemGroup> </Project> - 若未使用集中版本管理,直接在每个项目的.csproj文件中明确指定Oracle.EntityFrameworkCore版本,排除间接依赖的干扰
3. 彻底清理与重建
- 删除所有项目的
bin和obj目录 - 执行命令清理并重建解决方案:
dotnet clean dotnet build - 清理JetBrains Rider本地缓存(路径示例:
C:\Users\<用户名>\.Rider<版本号>\system\caches),重启Rider后重试迁移
4. 对比参考解决方案配置
- 导出参考解决方案的依赖列表:
dotnet list package > reference-packages.txt - 与当前解决方案的依赖列表对比,找出EF Core及Oracle驱动相关的版本差异,同步调整
- 检查参考解决方案中DbContext的设计时初始化逻辑,比如是否实现了
IDesignTimeDbContextFactory接口,或是否有特殊构造函数,确保当前项目逻辑一致
5. 验证版本兼容性
- 确认Oracle.EntityFrameworkCore 8.23.60与当前使用的Microsoft.EntityFrameworkCore主版本完全匹配(Oracle EF Core版本需与EF Core主版本对应,如EF Core 8.x对应Oracle EF Core 8.x系列),若不匹配则调整到兼容版本
内容的提问来源于stack exchange,提问作者adam440
相关产品推荐
相关产品推荐

