Skip to content

Commit a924461

Browse files
committed
CSHARP-5816: Insonsistent behavior of EnsureNoMemberMapConflicts for discriminator convention
1 parent 8a009ec commit a924461

2 files changed

Lines changed: 33 additions & 1 deletion

File tree

src/MongoDB.Bson/Serialization/BsonClassMap.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1325,12 +1325,14 @@ internal IDiscriminatorConvention GetDiscriminatorConvention()
13251325
{
13261326
// it's possible but harmless for multiple threads to do the discriminator convention lookup at the same time
13271327
discriminatorConvention = LookupDiscriminatorConvention();
1328-
_discriminatorConvention = discriminatorConvention;
13291328

13301329
if (discriminatorConvention != null)
13311330
{
13321331
EnsureNoMemberMapConflicts(discriminatorConvention.ElementName);
13331332
}
1333+
1334+
// only cache if validation succeeds
1335+
_discriminatorConvention = discriminatorConvention;
13341336
}
13351337

13361338
return discriminatorConvention;

tests/MongoDB.Bson.Tests/Serialization/BsonClassMapTests.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
using MongoDB.Bson.IO;
2323
using MongoDB.Bson.Serialization;
2424
using MongoDB.Bson.Serialization.Attributes;
25+
using MongoDB.Bson.Serialization.Conventions;
2526
using MongoDB.Bson.TestHelpers;
2627
using Xunit;
2728

@@ -735,4 +736,33 @@ private class D : C
735736
{
736737
}
737738
}
739+
740+
public class BsonClassMapGetDiscriminatorConventionTests
741+
{
742+
[Fact]
743+
public void GetDiscriminatorConvention_should_throw_consistently_when_member_conflicts_with_discriminator_element_name()
744+
{
745+
BsonSerializer.RegisterDiscriminatorConvention(typeof(Foo), new FooDiscriminatorConvention5816());
746+
747+
var classMap = new BsonClassMap<Foo>();
748+
classMap.AutoMap();
749+
classMap.Freeze();
750+
751+
Assert.Throws<BsonSerializationException>(() => classMap.GetDiscriminatorConvention());
752+
Assert.Throws<BsonSerializationException>(() => classMap.GetDiscriminatorConvention());
753+
}
754+
755+
private class Foo
756+
{
757+
[BsonElement("type")]
758+
public string Type { get; set; }
759+
}
760+
761+
private class FooDiscriminatorConvention5816 : IDiscriminatorConvention
762+
{
763+
public string ElementName => "type";
764+
public Type GetActualType(IBsonReader bsonReader, Type nominalType) => nominalType;
765+
public BsonValue GetDiscriminator(Type nominalType, Type actualType) => nominalType.Name;
766+
}
767+
}
738768
}

0 commit comments

Comments
 (0)