升级到 3.0 版本
概述
本页描述了在将 .NET/C# 驱动程序升级到 3.0 版本时,您可能需要对应用程序进行的更改。
如何升级
本页列出了由 .NET/C# 驱动程序 3.0 版本引入的可能破坏性更改。要将 .NET/C# 驱动程序升级到 3.0 版本,请按照以下步骤操作
审查兼容性 页面,以确保新驱动程序版本与您的应用程序连接的 MongoDB 服务器版本以及您的应用程序运行的 .NET 或 .NET 框架版本兼容。
如果您正在使用 2.x 版本的 .NET/C# 驱动程序,请升级到 v2.30。要这样做,请按照 v2.x 升级指南。
解决在版本 3.0 破坏性更改 部分中描述的破坏性更改。
示例
如果您正在将驱动程序从 v2.14 升级到 v3.0,首先使用 v2.x 升级指南将您的驱动程序升级到 v2.30。然后,解决 v3.0 的所有破坏性更改。
版本 3.0 破坏性更改
驱动程序停止支持 MongoDB 服务器 v3.6 及更早版本。您必须将 MongoDB 服务器升级到 v4.0 或更高版本。
要了解如何升级您的 MongoDB 服务器部署,请参阅 MongoDB 服务器手册中的 发行说明。
要了解更多关于 .NET/C# 驱动程序版本和 MongoDB 服务器版本之间的兼容性信息,请访问 兼容性 页面。
驱动程序停止支持 .NET Core 2.x 和 .NET Framework 4.6。您必须升级到 .NET Core 3.x 或更高版本,或 .NET Framework 4.7.2 或更高版本。
要了解更多关于 .NET/C# 驱动程序版本和 .NET 版本之间的兼容性信息,请访问 兼容性 页面。
驱动程序移除了mongocsharpdriver NuGet 包,该包在 2.x 版本的驱动程序中实现了过时的 v1.x API。如果你正在使用 v1.x API,必须迁移到新的 API。
在
MongoDB.Driver.Core
命名空间中的类、方法和属性在 v2.30 版本中被弃用,并标记为internal
。如果驱动程序为弃用的类、方法或属性提供了替代方案,v2.30 版本的编译器消息将显示它。在驱动程序之前版本中被弃用的
MongoDB.Bson
命名空间中的方法、属性和构造函数已被删除。如果驱动程序为弃用的方法、属性或构造函数提供了替代方案,v2.30 版本的编译器消息将显示它。驱动程序放弃了对
MONGODB-CR
认证机制的 support。有关在 .NET/C# 驱动程序中配置认证的更多信息,请参阅 Authentication Mechanisms。驱动程序用
IQueryable
接口替换了IMongoQueryable
接口,遵循了大多数其他 LINQ 提供程序的模式。如果你的应用程序中包含对IMongoQueryable
的引用,请将它们替换为IQueryable
。驱动程序移除了
ClusterBuilder.ConfigureSdamLogging()
方法。要配置应用程序中的日志记录,请参阅 Logging 指南。此版本的驱动程序已删除 LINQ2 提供程序。你必须使用 LINQ3 来执行所有 LINQ 查询。
使用客户端投影的查询默认将抛出
ExpressionNotSupportedException
错误。要启用客户端投影,将TranslationOptions
对象的EnableClientSideProjections
属性设置为true
。您可以传递此TranslationOptions
对象到一个AggregateOptions
或FindOptions
对象以启用单个查询的客户端投影,或传递到一个MongoClientSettings
对象以启用应用程序中所有查询的客户端投影。之前的 .NET/C# 驱动程序支持两种 GUID 表示模式。在 3.0 版本中,
GuidRepresentationMode.V3
是唯一支持的模式。此更改对驱动程序有以下影响已删除
BsonBinaryData(Guid)
构造函数。要从 GUID 构造BsonBinaryData
对象,请使用BsonBinaryData.Create(Guid, GuidRepresentation)
构造函数。已删除
BsonBinaryData.GuidRepresentation
属性。您只能在子类型为4的
BsonBinaryData
对象上调用BsonBinaryData.ToGuid()
方法。如果对象有其他子类型,您必须调用BsonBinaryData.ToGuid(GuidRepresentation)
方法并指定子类型。
前面的更改仅影响您直接序列化和反序列化BSON文档的应用程序。如果您只将MongoDB文档映射到POCOs,则
GuidRepresentationMode
不会影响您的应用程序。有关在.NET/C#驱动程序中序列化GUID的更多信息,请参阅GUIDs页面。
异常类及其相关类型不再包含
[Serializable]
属性,因此不再支持Microsoft旧版序列化API。要了解如何使用.NET/C#驱动程序序列化对象,请参阅序列化指南。TLS 1.0和1.1不再受支持。您必须使用TLS 1.2或更高版本。要了解有关.NET/C#驱动程序中TLS/SSL配置的更多信息,请参阅在连接上启用TLS。
默认情况下,驱动程序将
Decimal128
和decimal
值序列化为BSONDecimal128
值。在驱动程序的先前版本中,默认情况下将这些值序列化为BSONstring
值。要在v3.0中将decimal
或Decimal128
值序列化为字符串,将[BsonRepresentation(BsonType.String)]
属性应用于字段。要了解有关在序列化期间指定BSON类型的更多信息,请参阅POCOs页面上的自定义序列化部分。
默认情况下,驱动程序将
DateTimeOffset
值序列化为BSON文档。在驱动程序的先前版本中,默认情况下将这些值序列化为BSON数组。要在v3.0中将DateTimeOffset
值序列化为数组,将[BsonRepresentation(BsonType.Array)]
属性应用于字段。默认的JSON输出模式是Relaxed Extended JSON,这是一种基于JSON标准的字符串格式,用于描述BSON文档。Relaxed Extended JSON以牺牲类型保留为代价强调了可读性和互操作性。
要使用不同的JSON输出模式,创建一个新的
JsonWriterSettings
对象。将此对象的OutputMode
属性设置为JsonOutputMode
枚举中的一个值,然后在序列化文档时将其传递给ToJson()
方法。以下代码示例显示了如何将BSON文档序列化为Strict JSON:// Configure JsonWriterSettings var jsonWriterSettings = new JsonWriterSettings { OutputMode = JsonOutputMode.Strict }; // Serialize the document to JSON using the configured settings var json = document.ToJson(jsonWriterSettings); MongoClient
构造函数只接受一个Credential
对象,而不是一个数组。要使用亚马逊网络服务(AWS)身份验证,您必须将
MongoDB.Driver.Authentication.AWS
包添加到您的项目中,并在应用程序的启动代码中注册身份验证提供者。有关使用 .NET/C# 驱动程序与 AWS 身份验证的更多信息,请参阅 AWS 身份和访问管理。要使用使用中加密,您必须将
MongoDB.Driver.Encryption
包添加到您的项目中,并在应用程序的启动代码中注册加密机制。有关使用 .NET/C# 驱动程序中使用中加密的更多信息,请参阅 MongoDB 服务器手册中的 使用中加密。如果您尝试将浮点数
Infinity
或NaN
的值序列化为整数表示形式,驱动程序将抛出OverflowException
异常。有关浮点数Infinity
和NaN
的更多信息,请参阅 MSDN 上的 Double.NaN, Double.PositiveInfinity, 和 Double.NegativeInfinity.。驱动程序对
BsonValue
类进行了以下更改:从
AsLocalTime
和AsUniversalTime
属性中移除了[Obsolete]
属性。添加了 AsNullableLocalTime 和 AsNullableUniversalTime 属性。
移除了
AsDateTime
属性。请使用 AsUniversalTime 属性代替。删除了
AsNullableDateTime
属性。请使用 AsNullableUniversalTime 属性。
驱动程序从
MongoClient.Cluster
中移除单个集群事件。要监听集群事件,请调用 ClusterBuilder.Subscribe() 方法。如果集合中任何类型使用标量区分符,则在集合上执行以下任何操作时,驱动程序都会抛出异常
调用
Aggregate().OfType<T>()
方法,如下例所示collection.Aggregate().OfType<T>() 调用
Aggregate().Match(item => item is T)
方法,如下例所示collection.Aggregate().Match(item => item is T)
要在集合上使用上述任一方法,您可以对集合中的每个类应用分层区分符。有关如何操作,请参阅 多态对象 页面。
或者,您可以用不同的方式检查每个项的类型。例如,您可以调用
Where()
方法,并传递一个表达式,该表达式将项的类型与您正在寻找的类型进行比较,如下例所示collection.AsQueryable().Where(item => item.GetType() == typeof(T)); 有关类型区分符的更多信息,请参阅 多态对象。
驱动程序已使用继承未设计用于扩展的某些类型进行密封。这包括以下更改
驱动程序将所有混凝土序列化器进行封印。要实现自定义序列化器,请实现
IBsonSerializer
接口。驱动程序将
MongoClient
、MongoDatabase
和MongoCollection
类进行封印。我们建议直接使用IMongoClient
、IMongoDatabase
和IMongoCollection
接口。