From 30ac64aecc439ec82dd3f4d6a4a1b03940ae0ab4 Mon Sep 17 00:00:00 2001 From: Ferdinando Papale <4850119+papafe@users.noreply.github.com> Date: Thu, 7 May 2026 14:54:17 +0200 Subject: [PATCH 1/2] CSHARP-5816: Insonsistent behavior of `EnsureNoMemberMapConflicts` for discriminator convention --- .../Serialization/BsonClassMap.cs | 4 ++- .../Serialization/BsonClassMapTests.cs | 30 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/MongoDB.Bson/Serialization/BsonClassMap.cs b/src/MongoDB.Bson/Serialization/BsonClassMap.cs index 3e257d2259f..2f2810fc369 100644 --- a/src/MongoDB.Bson/Serialization/BsonClassMap.cs +++ b/src/MongoDB.Bson/Serialization/BsonClassMap.cs @@ -1325,12 +1325,14 @@ internal IDiscriminatorConvention GetDiscriminatorConvention() { // it's possible but harmless for multiple threads to do the discriminator convention lookup at the same time discriminatorConvention = LookupDiscriminatorConvention(); - _discriminatorConvention = discriminatorConvention; if (discriminatorConvention != null) { EnsureNoMemberMapConflicts(discriminatorConvention.ElementName); } + + // only cache if validation succeeds + _discriminatorConvention = discriminatorConvention; } return discriminatorConvention; diff --git a/tests/MongoDB.Bson.Tests/Serialization/BsonClassMapTests.cs b/tests/MongoDB.Bson.Tests/Serialization/BsonClassMapTests.cs index 337aae069c6..339e711930c 100644 --- a/tests/MongoDB.Bson.Tests/Serialization/BsonClassMapTests.cs +++ b/tests/MongoDB.Bson.Tests/Serialization/BsonClassMapTests.cs @@ -22,6 +22,7 @@ using MongoDB.Bson.IO; using MongoDB.Bson.Serialization; using MongoDB.Bson.Serialization.Attributes; +using MongoDB.Bson.Serialization.Conventions; using MongoDB.Bson.TestHelpers; using Xunit; @@ -735,4 +736,33 @@ private class D : C { } } + + public class BsonClassMapGetDiscriminatorConventionTests + { + [Fact] + public void GetDiscriminatorConvention_should_throw_consistently_when_member_conflicts_with_discriminator_element_name() + { + BsonSerializer.RegisterDiscriminatorConvention(typeof(Foo), new FooDiscriminatorConvention5816()); + + var classMap = new BsonClassMap(); + classMap.AutoMap(); + classMap.Freeze(); + + Assert.Throws(() => classMap.GetDiscriminatorConvention()); + Assert.Throws(() => classMap.GetDiscriminatorConvention()); + } + + private class Foo + { + [BsonElement("type")] + public string Type { get; set; } + } + + private class FooDiscriminatorConvention5816 : IDiscriminatorConvention + { + public string ElementName => "type"; + public Type GetActualType(IBsonReader bsonReader, Type nominalType) => nominalType; + public BsonValue GetDiscriminator(Type nominalType, Type actualType) => nominalType.Name; + } + } } From 92070fd903c4e116e81eb3702e757b05c2a3d869 Mon Sep 17 00:00:00 2001 From: Ferdinando Papale <4850119+papafe@users.noreply.github.com> Date: Thu, 7 May 2026 15:10:22 +0200 Subject: [PATCH 2/2] Small correction --- tests/MongoDB.Bson.Tests/Serialization/BsonClassMapTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/MongoDB.Bson.Tests/Serialization/BsonClassMapTests.cs b/tests/MongoDB.Bson.Tests/Serialization/BsonClassMapTests.cs index 339e711930c..eedf3b3f302 100644 --- a/tests/MongoDB.Bson.Tests/Serialization/BsonClassMapTests.cs +++ b/tests/MongoDB.Bson.Tests/Serialization/BsonClassMapTests.cs @@ -742,7 +742,7 @@ public class BsonClassMapGetDiscriminatorConventionTests [Fact] public void GetDiscriminatorConvention_should_throw_consistently_when_member_conflicts_with_discriminator_element_name() { - BsonSerializer.RegisterDiscriminatorConvention(typeof(Foo), new FooDiscriminatorConvention5816()); + BsonSerializer.RegisterDiscriminatorConvention(typeof(Foo), new FooDiscriminatorConvention()); var classMap = new BsonClassMap(); classMap.AutoMap(); @@ -758,7 +758,7 @@ private class Foo public string Type { get; set; } } - private class FooDiscriminatorConvention5816 : IDiscriminatorConvention + private class FooDiscriminatorConvention : IDiscriminatorConvention { public string ElementName => "type"; public Type GetActualType(IBsonReader bsonReader, Type nominalType) => nominalType;