Exception thrown when materialising read-only properties

XMLWordPrintableJSON

    • Type: Bug
    • Resolution: Fixed
    • Priority: Unknown
    • 9.0.1, 8.3.1
    • Affects Version/s: None
    • None
    • None
    • Dotnet Drivers
    • None
    • None
    • None
    • None
    • None
    • None

      Entity type:

      public class Book
      {
          public Book(string title, long isbn, int pages)
              : this(Guid.Empty, title, isbn, pages)
          {
          }
          
          private Book(Guid id, string title, long isbn, int pages)
          {
              Id = id;
              Title = title;
              Isbn = isbn;
              Pages = pages;
          }
      
          public Guid Id { get; }
          public string Title { get; set; }
          public long Isbn { get; }
          public int Pages { get; set; }
      
          //public Library? Library { get; set; }
      }
      

      Exception:

      Unhandled exception. System.ArgumentException: Expression must be writeable (Parameter 'left')
         at System.Linq.Expressions.Expression.RequiresCanWrite(Expression expression, String paramName)
         at System.Linq.Expressions.Expression.Assign(Expression left, Expression right)
         at System.Linq.Expressions.Expression.MakeBinary(ExpressionType binaryType, Expression left, Expression right, Boolean liftToNull, MethodInfo method, LambdaExpression conversion)
         at System.Linq.Expressions.ExpressionVisitor.VisitBinary(BinaryExpression node)
         at MongoDB.EntityFrameworkCore.Query.Visitors.ProjectionBindingRemovingExpressionVisitor.VisitBinary(BinaryExpression binaryExpression)
         at System.Dynamic.Utils.ExpressionVisitorUtils.VisitBlockExpressions(ExpressionVisitor visitor, BlockExpression block)
         at System.Linq.Expressions.ExpressionVisitor.VisitBlock(BlockExpression node)
         at System.Dynamic.Utils.ExpressionVisitorUtils.VisitBlockExpressions(ExpressionVisitor visitor, BlockExpression block)
         at System.Linq.Expressions.ExpressionVisitor.VisitBlock(BlockExpression node)
         at System.Linq.Expressions.ExpressionVisitor.VisitSwitchCase(SwitchCase node)
         at System.Linq.Expressions.ExpressionVisitor.Visit[T](ReadOnlyCollection`1 nodes, Func`2 elementVisitor)
         at System.Linq.Expressions.ExpressionVisitor.VisitSwitch(SwitchExpression node)
         at System.Linq.Expressions.ExpressionVisitor.VisitBinary(BinaryExpression node)
         at MongoDB.EntityFrameworkCore.Query.Visitors.ProjectionBindingRemovingExpressionVisitor.VisitBinary(BinaryExpression binaryExpression)
         at System.Dynamic.Utils.ExpressionVisitorUtils.VisitBlockExpressions(ExpressionVisitor visitor, BlockExpression block)
         at System.Linq.Expressions.ExpressionVisitor.VisitBlock(BlockExpression node)
         at System.Linq.Expressions.ExpressionVisitor.VisitConditional(ConditionalExpression node)
         at System.Linq.Expressions.ExpressionVisitor.VisitConditional(ConditionalExpression node)
         at System.Dynamic.Utils.ExpressionVisitorUtils.VisitBlockExpressions(ExpressionVisitor visitor, BlockExpression block)
         at System.Linq.Expressions.ExpressionVisitor.VisitBlock(BlockExpression node)
         at System.Linq.Expressions.ExpressionVisitor.VisitConditional(ConditionalExpression node)
         at System.Dynamic.Utils.ExpressionVisitorUtils.VisitBlockExpressions(ExpressionVisitor visitor, BlockExpression block)
         at System.Linq.Expressions.ExpressionVisitor.VisitBlock(BlockExpression node)
         at MongoDB.EntityFrameworkCore.Query.Visitors.MongoShapedQueryCompilingExpressionVisitor.VisitShapedQuery(ShapedQueryExpression shapedQueryExpression)
         at Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.VisitExtension(Expression extensionExpression)
         at MongoDB.EntityFrameworkCore.Query.MongoQueryCompilationContext.CreateQueryExecutor[TResult](Expression originalQuery)
         at Microsoft.EntityFrameworkCore.Storage.Database.CompileQuery[TResult](Expression query, Boolean async)
         at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.CompileQueryCore[TResult](IDatabase database, Expression query, IModel model, Boolean async)
         at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.<>c__DisplayClass11_0`1.<ExecuteCore>b__0()
         at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQuery[TResult](Object cacheKey, Func`1 compiler)
         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 Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1.GetEnumerator()
         at Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.System.Collections.Generic.IEnumerable<TEntity>.GetEnumerator()
         at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
         at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
         at Program.<Main>$(String[] args) in /Users/arthur.vickers/code/OnYourOwnNow/OnYourOwnNow/Program.cs:line 37
      

      Repro:

      using var context = new LibraryContext();
      context.Database.EnsureDeleted();
      context.Database.EnsureCreated();
      
      context.AddRange(
          new Book("The Lord of the Rings", 9788845292613, 1000));
      
      context.SaveChanges();
      
      var books = context.Books.ToList();
      foreach (var book in books)
      {
          Console.WriteLine($"{book.Id}: {book.Title} ({book.Isbn}) {book.Pages} pages.");
      }
      
      public class LibraryContext : DbContext
      {
          protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
              => optionsBuilder
                  //.UseSqlite("DataSource = db.dat")
                  .UseMongoDB("mongodb://localhost:27017", "Library1")
                  .EnableSensitiveDataLogging()
                  .LogTo(Console.WriteLine, LogLevel.Information);
      
          protected override void OnModelCreating(ModelBuilder modelBuilder)
          {
              modelBuilder.Entity<Book>(b =>
              {
                  b.Property(e => e.Id);
                  b.Property(e => e.Isbn);
              });
          }
          
          public DbSet<Book> Books => Set<Book>();
      }
      
      public class Book
      {
          public Book(string title, long isbn, int pages)
              : this(Guid.Empty, title, isbn, pages)
          {
          }
          
          private Book(Guid id, string title, long isbn, int pages)
          {
              Id = id;
              Title = title;
              Isbn = isbn;
              Pages = pages;
          }
      
          public Guid Id { get; }
          public string Title { get; set; }
          public long Isbn { get; }
          public int Pages { get; set; }
      
          //public Library? Library { get; set; }
      }
      
      

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

              Created:
              Updated:
              Resolved: