Value conversions can fail when using driver 3.7

XMLWordPrintableJSON

    • Type: Bug
    • Resolution: Duplicate
    • Priority: Unknown
    • None
    • Affects Version/s: 8.0.0, 9.0.0, 10.0.0
    • Component/s: None
    • None
    • None
    • Dotnet Drivers
    • None
    • None
    • None
    • None
    • None
    • None

      Exception:

      System.ArgumentException
      GenericArguments[1], 'System.DayOfWeek', on 'MongoDB.Bson.Serialization.Serializers.DowncastingSerializer`2[TBase,TDerived]' violates the constraint of type 'TDerived'.
         at System.RuntimeType.ValidateGenericArguments(MemberInfo definition, RuntimeType[] genericArguments, Exception e)
         at System.RuntimeType.MakeGenericType(Type[] typeArguments)
         at MongoDB.Bson.Serialization.Serializers.DowncastingSerializer.Create(Type baseType, Type derivedType, IBsonSerializer derivedTypeSerializer)
         at MongoDB.Driver.Linq.Linq3Implementation.SerializerFinders.SerializerMap.AddSerializer(Expression node, IBsonSerializer serializer)
         at MongoDB.Driver.Linq.Linq3Implementation.SerializerFinders.SerializerFinderVisitor.AddNodeSerializer(Expression node, IBsonSerializer serializer)
         at MongoDB.Driver.Linq.Linq3Implementation.SerializerFinders.SerializerFinderVisitor.VisitMember(MemberExpression node)
         at MongoDB.Driver.Linq.Linq3Implementation.SerializerFinders.SerializerFinderVisitor.Visit(Expression node)
         at System.Linq.Expressions.ExpressionVisitor.VisitUnary(UnaryExpression node)
         at MongoDB.Driver.Linq.Linq3Implementation.SerializerFinders.SerializerFinderVisitor.VisitUnary(UnaryExpression node)
         at MongoDB.Driver.Linq.Linq3Implementation.SerializerFinders.SerializerFinderVisitor.Visit(Expression node)
         at System.Linq.Expressions.ExpressionVisitor.VisitBinary(BinaryExpression node)
         at MongoDB.Driver.Linq.Linq3Implementation.SerializerFinders.SerializerFinderVisitor.VisitBinary(BinaryExpression node)
         at MongoDB.Driver.Linq.Linq3Implementation.SerializerFinders.SerializerFinderVisitor.Visit(Expression node)
         at System.Linq.Expressions.ExpressionVisitor.VisitLambda[T](Expression`1 node)
         at MongoDB.Driver.Linq.Linq3Implementation.SerializerFinders.SerializerFinderVisitor.VisitLambda[T](Expression`1 node)
         at MongoDB.Driver.Linq.Linq3Implementation.SerializerFinders.SerializerFinderVisitor.Visit(Expression node)
         at System.Linq.Expressions.ExpressionVisitor.VisitUnary(UnaryExpression node)
         at MongoDB.Driver.Linq.Linq3Implementation.SerializerFinders.SerializerFinderVisitor.VisitUnary(UnaryExpression node)
         at MongoDB.Driver.Linq.Linq3Implementation.SerializerFinders.SerializerFinderVisitor.Visit(Expression node)
         at System.Dynamic.Utils.ExpressionVisitorUtils.VisitArguments(ExpressionVisitor visitor, IArgumentProvider nodes)
         at System.Linq.Expressions.ExpressionVisitor.VisitMethodCall(MethodCallExpression node)
         at MongoDB.Driver.Linq.Linq3Implementation.SerializerFinders.SerializerFinderVisitor.VisitMethodCall(MethodCallExpression node)
         at MongoDB.Driver.Linq.Linq3Implementation.SerializerFinders.SerializerFinderVisitor.Visit(Expression node)
         at System.Dynamic.Utils.ExpressionVisitorUtils.VisitArguments(ExpressionVisitor visitor, IArgumentProvider nodes)
         at System.Linq.Expressions.ExpressionVisitor.VisitMethodCall(MethodCallExpression node)
         at MongoDB.Driver.Linq.Linq3Implementation.SerializerFinders.SerializerFinderVisitor.VisitMethodCall(MethodCallExpression node)
         at MongoDB.Driver.Linq.Linq3Implementation.SerializerFinders.SerializerFinderVisitor.Visit(Expression node)
         at System.Dynamic.Utils.ExpressionVisitorUtils.VisitArguments(ExpressionVisitor visitor, IArgumentProvider nodes)
         at System.Linq.Expressions.ExpressionVisitor.VisitMethodCall(MethodCallExpression node)
         at MongoDB.Driver.Linq.Linq3Implementation.SerializerFinders.SerializerFinderVisitor.VisitMethodCall(MethodCallExpression node)
         at MongoDB.Driver.Linq.Linq3Implementation.SerializerFinders.SerializerFinderVisitor.Visit(Expression node)
         at MongoDB.Driver.Linq.Linq3Implementation.SerializerFinders.SerializerFinder.FindSerializers(Expression expression, ExpressionTranslationOptions translationOptions, SerializerMap nodeSerializers)
         at MongoDB.Driver.Linq.Linq3Implementation.Translators.TranslationContext.Create(Expression expression, Expression initialNode, IBsonSerializer initialSerializer, ExpressionTranslationOptions translationOptions, TranslationContextData data)
         at MongoDB.Driver.Linq.Linq3Implementation.Translators.TranslationContext.Create(Expression expression, IMongoQueryProviderInternal provider, ExpressionTranslationOptions translationOptions, TranslationContextData data)
         at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToExecutableQueryTranslators.ExpressionToExecutableQueryTranslator.TranslateScalar[TDocument,TResult](MongoQueryProvider`1 provider, Expression expression, ExpressionTranslationOptions translationOptions)
         at MongoDB.Driver.Linq.Linq3Implementation.MongoQueryProvider`1.Execute[TResult](Expression expression)
         at MongoDB.EntityFrameworkCore.Storage.MongoClientWrapper.ExecuteScalar[T](MongoExecutableQuery executableQuery) in /Users/arthur.vickers/code/mongo-efcore-provider/src/MongoDB.EntityFrameworkCore/Storage/MongoClientWrapper.cs:line 115
         at MongoDB.EntityFrameworkCore.Storage.MongoClientWrapper.Execute[T](MongoExecutableQuery executableQuery, Action& log) in /Users/arthur.vickers/code/mongo-efcore-provider/src/MongoDB.EntityFrameworkCore/Storage/MongoClientWrapper.cs:line 91
         at MongoDB.EntityFrameworkCore.Query.QueryingEnumerable`2.Enumerator.MoveNextHelper() in /Users/arthur.vickers/code/mongo-efcore-provider/src/MongoDB.EntityFrameworkCore/Query/QueryingEnumerable.cs:line 168
         at MongoDB.EntityFrameworkCore.Query.QueryingEnumerable`2.Enumerator.MoveNext() in /Users/arthur.vickers/code/mongo-efcore-provider/src/MongoDB.EntityFrameworkCore/Query/QueryingEnumerable.cs:line 110
         at System.Linq.Enumerable.TryGetSingle[TSource](IEnumerable`1 source, Boolean& found)
         at lambda_method33(Closure, QueryContext)
         at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.ExecuteCore[TResult](Expression query, Boolean async, CancellationToken cancellationToken)
         at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.Execute[TResult](Expression query)
         at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.Execute[TResult](Expression expression)
         at MongoDB.EntityFrameworkCore.FunctionalTests.Mapping.ValueConverterTests.Nullable_enum_can_deserialize_and_query_from_nullable_int(Nullable`1 day, Boolean defaultConverter) in /Users/arthur.vickers/code/mongo-efcore-provider/tests/MongoDB.EntityFrameworkCore.FunctionalTests/Mapping/ValueConverterTests.cs:line 525
         at InvokeStub_ValueConverterTests.Nullable_enum_can_deserialize_and_query_from_nullable_int(Object, Span`1)
         at System.Reflection.MethodBaseInvoker.InvokeWithFewArgs(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
      
      System.TypeLoadException
      GenericArguments[1], 'System.DayOfWeek', on 'MongoDB.Bson.Serialization.Serializers.DowncastingSerializer`2[TBase,TDerived]' violates the constraint of type parameter 'TDerived'.
         at System.RuntimeTypeHandle.Instantiate(Type[] inst)
         at System.RuntimeType.MakeGenericType(Type[] typeArguments)
      

      Repro:

      await using var db1 = new DbStrings();
      db1.Database.EnsureCreated();
      db1.Add(new DaysIsString { days = "Monday" });
      db1.SaveChanges();
      
      await using var db2 = new DbInts();
      var days = 2;
      
      _ = db2.Set<DaysIsNullableInt>().First(e => e.days == days);
      
      public class DbStrings : DbContext
      {
          protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
              => optionsBuilder.UseMongoDB("mongodb://localhost:56669/?directConnection=true", "Fruity7");
      
          protected override void OnModelCreating(ModelBuilder modelBuilder)
          {
              modelBuilder.Entity<DaysIsString>();
          }
      }
      
      public class DbInts : DbContext
      {
          protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
              => optionsBuilder.UseMongoDB("mongodb://localhost:56669/?directConnection=true", "Fruity7");
      
          protected override void OnModelCreating(ModelBuilder modelBuilder)
          {
              modelBuilder.Entity<DaysIsNullableInt>().Property(e => e.days).HasConversion<string>();
          }
      }
      
      class DaysIsNullableInt : IdIsObjectId
      {
          public int? days { get; set; }
      }
      
      public class DaysIsString : IdIsObjectId
      {
          public string days { get; set; }
      }
      
      public class IdIsObjectId
      {
          public ObjectId _id { get; set; }
      }
      

            Assignee:
            Damien Guard
            Reporter:
            Arthur Vickers
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated:
              Resolved: