从 MongoDB 驱动 2 迁移到 3
简介
MongoDB 驱动 3 的发布包含了许多用户请求的修复和改进,这些内容在之前的版本中由于向后兼容性的考虑而被推迟。它还具有内部改进,以减少技术债务并增强可维护性。一项重大更新是移除了大部分公共 API(主要来自 MongoDB.Driver.Core),这些 API 原本并非设计给公共使用。被移除的 API 在 2.30.0 版本中已被标记为废弃。
关于破坏性变更的完整列表和升级指南,请参阅 升级指南。
仓储(Repository)层变更
由于 IMongoQueryable 已被移除,MongoDbRepository 类中的一些方法签名已经更新。具体变更如下:
- 新增了
GetQueryableAsync方法,它返回IQueryable<TEntity>。 GetMongoQueryable和GetMongoQueryableAsync方法现在返回IQueryable<TEntity>,而不是IMongoQueryable<TEntity>。GetMongoQueryable和GetMongoQueryableAsync方法被标记为过时,你应该使用新的GetQueryableAsync方法来替代。
请通过搜索并替换这些方法调用来更新你的应用程序。
GetQueryableAsync方法的返回值是IQueryable<TEntity>,可以直接用来执行查询,类似于 EF Core。移除你项目中所有的IMongoQueryable实例,并用IQueryable替换它们。
之前的代码示例:
var myEntity = await (await GetMongoQueryableAsync()).As<IMongoQueryable<MyEntity>>().FirstOrDefaultAsync(x => x.Id == id);
更新后的代码示例:
var myEntity = await GetQueryableAsync().FirstOrDefaultAsync(x => x.Id == id);
单元测试变更
之前,我们使用 EphemeralMongo 库进行单元测试。然而,它不支持最新版本的 MongoDB.Driver 3.x。你应该用 MongoSandbox 替换它。
在你的单元测试项目文件中,将以下内容:
<PackageReference Include="EphemeralMongo.Core" Version="1.1.3" />
<PackageReference Include="EphemeralMongo6.runtime.linux-x64" Version="1.1.3" Condition="$([MSBuild]::IsOSPlatform('Linux'))" />
<PackageReference Include="EphemeralMongo6.runtime.osx-x64" Version="1.1.3" Condition="$([MSBuild]::IsOSPlatform('OSX'))" />
<PackageReference Include="EphemeralMongo6.runtime.win-x64" Version="1.1.3" Condition="$([MSBuild]::IsOSPlatform('Windows'))" />
替换为:
<PackageReference Include="MongoSandbox.Core" Version="1.0.1" />
<PackageReference Include="MongoSandbox6.runtime.linux-x64" Version="1.0.1" Condition="$([MSBuild]::IsOSPlatform('Linux'))" />
<PackageReference Include="MongoSandbox6.runtime.osx-x64" Version="1.0.1" Condition="$([MSBuild]::IsOSPlatform('OSX'))" />
<PackageReference Include="MongoSandbox6.runtime.win-x64" Version="1.0.1" Condition="$([MSBuild]::IsOSPlatform('Windows'))" />
在你的单元测试类中,将 using EphemeralMongo 替换为 using MongoSandbox。
官方升级指南
我们建议查看 MongoDB 驱动 3 的 升级指南,以确保顺利的迁移过程。
抠丁客


