Uploaded image for project: 'C# Driver'
  1. C# Driver
  2. CSHARP-3195

GuidRepresentation made obsolete while function appears impared and documentation remains out of date.

    XMLWordPrintable

    Details

    • Type: Bug
    • Status: Open
    • Priority: Major - P3
    • Resolution: Unresolved
    • Affects Version/s: 2.11.0
    • Fix Version/s: None
    • Component/s: API, Bson, Documentation
    • Security Level: Public
    • Labels:
      None
    • Environment:
      All
    • Backwards Compatibility:
      Fully Compatible

      Description

      Linked to https://jira.mongodb.org/browse/CSHARP-3179

      The entirety of the commonly used BsonDefaults method of setting GuidRepresentation has been marked obsolete while the documentation still refers to it and neither the "obsolete" warning or xmldoc inform you of what the replacement is beyond the vague statement `[Obsolete("Configure serializers instead.")]`

      The following example will fail with `MongoDB.Driver.MongoCommandException: 'Command findAndModify failed: After applying the update, the (immutable) field '_id' was found to have been altered to _id: UUID("45206b70-146b-4947-9de2-aaab99c2223b").'`

      Appending `?uuidRepresentation=Standard` to the connection string and the upsert will work as expected (previous behaviour); as would setting `BsonDefaults.GuidRepresentation = GuidRepresentation.Standard;` both of these configurations correctly store the ID as UUID() in mongo.

      Swapping BSONID for [BsonRepresentation(BsonType.Binary)] will allow the code to run otherwise unaltered but then stores the ID as BinData(3, "a1A8tGgqy0myU3jvfIW3wQ==")

      Changing the ID field to [BsonId, BsonGuidRepresentation(GuidRepresentation.Standard)]
      results in the immutable id error again.

      using MongoDB.Driver;
      using System;
      using System.Threading.Tasks;
      using MongoDB.Bson;
      using MongoDB.Bson.Serialization.Attributes;
       
      namespace MongoGuidStandardIssue
      {
       
          [Serializable]
          public class ReadModel
          {
              public ReadModel(Guid id)
              {
                  Id = id;
                  CreatedDate = DateTimeOffset.UtcNow;
              }
       
              [BsonId]
              public Guid Id { get; set; }
       
              [BsonRepresentation(BsonType.String)]
              public DateTimeOffset CreatedDate { get; set; }
       
          }
       
          public sealed class UserReadModel : ReadModel
          {
              public string Username { get; set; }
              public UserReadModel(Guid id) : base(id) { }
          }
       
       
          public static class Program
          {
              public static async Task Main(string[] args)
              {
                  BsonSerializer.RegisterSerializer(new GuidSerializer(GuidRepresentation.Standard));
                  var mongoClient = new MongoClient("mongodb://localhost:32768");
       
                  var readStoreDb = mongoClient.GetDatabase("test");
       
                  var userReadStore = readStoreDb.GetCollection<UserReadModel>(nameof(UserReadModel));
       
                  var userId = Guid.NewGuid();
                  var newUser = new UserReadModel(userId)
                  {
                      CreatedDate = DateTimeOffset.UtcNow,
                      Username = "Test " + DateTime.Now.Ticks.ToString()
                  };
       
                  var findOneAndReplaceTask = await userReadStore.FindOneAndReplaceAsync<UserReadModel>(_ => _.Id == newUser.Id, newUser, new FindOneAndReplaceOptions<UserReadModel> { IsUpsert = true, ReturnDocument = ReturnDocument.After });
       
                  Console.WriteLine("Done");
                  Console.ReadLine();
              }
          }
      }
      
      

       
      We appear to have gone from one line of code to configure ID storage to config roulette.

      Its hard to tell if this is an underlying driver issue, a lack of validation or just a communication/documentation issue; the commit messages around the change don't shine much light on it either. ( ` CSHARP-2724: Implement specification for handling native UUID types. `
       https://github.com/mongodb/mongo-csharp-driver/commit/b0b11348e1fb2418ca6a5999a2494db54ec186e5 ) the addition of new code that is immediately marked as obsolete also muddies the water a tad.

      Thanks

        Attachments

        1. image-2020-08-28-09-48-09-587.png
          image-2020-08-28-09-48-09-587.png
          80 kB
        2. MongoGuidStandardIssue.csproj
          0.3 kB
        3. Program.cs
          2 kB

          Issue Links

            Activity

              People

              Assignee:
              Unassigned Unassigned
              Reporter:
              chris.mckee@ivendi.com Chris McKee
              Participants:
              Votes:
              5 Vote for this issue
              Watchers:
              10 Start watching this issue

                Dates

                Created:
                Updated:

                    PagerDuty