项目

从 MongoDB 驱动 2 迁移到 3

简介

MongoDB 驱动 3 的发布包含了许多用户请求的修复和改进,这些内容在之前的版本中由于向后兼容性的考虑而被推迟。它还具有内部改进,以减少技术债务并增强可维护性。一项重大更新是移除了大部分公共 API(主要来自 MongoDB.Driver.Core),这些 API 原本并非设计给公共使用。被移除的 API 在 2.30.0 版本中已被标记为废弃。

关于破坏性变更的完整列表和升级指南,请参阅 升级指南

仓储(Repository)层变更

由于 IMongoQueryable 已被移除,MongoDbRepository 类中的一些方法签名已经更新。具体变更如下:

  • 新增了 GetQueryableAsync 方法,它返回 IQueryable<TEntity>
  • GetMongoQueryableGetMongoQueryableAsync 方法现在返回 IQueryable<TEntity>,而不是 IMongoQueryable<TEntity>
  • GetMongoQueryableGetMongoQueryableAsync 方法被标记为过时,你应该使用新的 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 的 升级指南,以确保顺利的迁移过程。

在本文档中