Skip to content

Property using Enum with ExecuteUpdateAsync throws 'Object reference not set to an instance of an object.' #35656

@johnwc

Description

@johnwc

Bug description

When running the code below, the error is always thrown. AuthType is a enum type. In ef 8, this worked without an issue. Upgrading to ef 9, now throws an error. If we move the coalesce out to a variable, and use the variable in the method, all works as normal. But this means we now need to pull down a copy of the row to get the value to coalesce with.

Your code

Error

            await _Data.DbContext.ImportJobs
                .Where(q => q.Source.Code == source && q.Id == jobId)
                .ExecuteUpdateAsync(q => q
                .SetProperty(q => q.AuthData, q => authData ?? q.AuthData)
                .SetProperty(q => q.AuthType, q => model.AuthType ?? q.AuthType)
                .SetProperty(q => q.BaseUri, q => model.BaseUri ?? q.BaseUri)
                .SetProperty(q => q.BaseFilter, q => model.BaseFilter ?? q.BaseFilter)
                .SetProperty(q => q.Description, q => model.Description ?? q.Description)
                .SetProperty(q => q.Enabled, q => model.Enabled ?? q.Enabled)
                .SetProperty(q => q.InitialImport, q => model.InitialImport ?? q.InitialImport)
                .SetProperty(q => q.MaxPerRequest, q => model.MaxPerRequest ?? q.MaxPerRequest)
                .SetProperty(q => q.MaxSkip, q => model.MaxSkip ?? q.MaxSkip)
                .SetProperty(q => q.Name, q => model.Name ?? q.Name)
                .SetProperty(q => q.ReplicateApi, q => model.ReplicateApi ?? q.ReplicateApi)
                );


Does not error

var authType = model.AuthType ?? resoJob.AuthType;
            await _Data.DbContext.ImportJobs
                .Where(q => q.Source.Code == source && q.Id == jobId)
                .ExecuteUpdateAsync(q => q
                .SetProperty(q => q.AuthData, q => authData ?? q.AuthData)
                .SetProperty(q => q.AuthType, authType)
                .SetProperty(q => q.BaseUri, q => model.BaseUri ?? q.BaseUri)
                .SetProperty(q => q.BaseFilter, q => model.BaseFilter ?? q.BaseFilter)
                .SetProperty(q => q.Description, q => model.Description ?? q.Description)
                .SetProperty(q => q.Enabled, q => model.Enabled ?? q.Enabled)
                .SetProperty(q => q.InitialImport, q => model.InitialImport ?? q.InitialImport)
                .SetProperty(q => q.MaxPerRequest, q => model.MaxPerRequest ?? q.MaxPerRequest)
                .SetProperty(q => q.MaxSkip, q => model.MaxSkip ?? q.MaxSkip)
                .SetProperty(q => q.Name, q => model.Name ?? q.Name)
                .SetProperty(q => q.ReplicateApi, q => model.ReplicateApi ?? q.ReplicateApi)
                );

Stack traces

at Microsoft.EntityFrameworkCore.Query.Internal.ExpressionTreeFuncletizer.ProcessEvaluatableRoot(Expression evaluatableRoot, State& state, Boolean forceEvaluation)
   at Microsoft.EntityFrameworkCore.Query.Internal.ExpressionTreeFuncletizer.VisitLambda[T](Expression`1 lambda)
   at Microsoft.EntityFrameworkCore.Query.Internal.ExpressionTreeFuncletizer.Visit[T](ReadOnlyCollection`1 expressions, Func`2 elementVisitor, StateType& aggregateStateType, State[]& expressionStates, Boolean poolExpressionStates)
   at Microsoft.EntityFrameworkCore.Query.Internal.ExpressionTreeFuncletizer.VisitMethodCall(MethodCallExpression methodCall)
   at Microsoft.EntityFrameworkCore.Query.Internal.ExpressionTreeFuncletizer.VisitMethodCall(MethodCallExpression methodCall)
   at Microsoft.EntityFrameworkCore.Query.Internal.ExpressionTreeFuncletizer.VisitMethodCall(MethodCallExpression methodCall)
   at Microsoft.EntityFrameworkCore.Query.Internal.ExpressionTreeFuncletizer.VisitMethodCall(MethodCallExpression methodCall)
   at Microsoft.EntityFrameworkCore.Query.Internal.ExpressionTreeFuncletizer.VisitMethodCall(MethodCallExpression methodCall)
   at Microsoft.EntityFrameworkCore.Query.Internal.ExpressionTreeFuncletizer.VisitMethodCall(MethodCallExpression methodCall)
   at Microsoft.EntityFrameworkCore.Query.Internal.ExpressionTreeFuncletizer.VisitMethodCall(MethodCallExpression methodCall)
   at Microsoft.EntityFrameworkCore.Query.Internal.ExpressionTreeFuncletizer.VisitMethodCall(MethodCallExpression methodCall)
   at Microsoft.EntityFrameworkCore.Query.Internal.ExpressionTreeFuncletizer.VisitMethodCall(MethodCallExpression methodCall)
   at Microsoft.EntityFrameworkCore.Query.Internal.ExpressionTreeFuncletizer.VisitMethodCall(MethodCallExpression methodCall)
   at Microsoft.EntityFrameworkCore.Query.Internal.ExpressionTreeFuncletizer.VisitLambda[T](Expression`1 lambda)
   at Microsoft.EntityFrameworkCore.Query.Internal.ExpressionTreeFuncletizer.VisitUnary(UnaryExpression unary)
   at Microsoft.EntityFrameworkCore.Query.Internal.ExpressionTreeFuncletizer.Visit[T](ReadOnlyCollection`1 expressions, Func`2 elementVisitor, StateType& aggregateStateType, State[]& expressionStates, Boolean poolExpressionStates)
   at Microsoft.EntityFrameworkCore.Query.Internal.ExpressionTreeFuncletizer.VisitMethodCall(MethodCallExpression methodCall)
   at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.ExecuteCore[TResult](Expression query, Boolean async, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.ExecuteAsync[TResult](Expression query, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ExecuteUpdateAsync[TSource](IQueryable`1 source, Expression`1 setPropertyCalls, CancellationToken cancellationToken)
   at Admin.API.Controllers.JobsController.<UpdateJob>d__3.MoveNext() in D:\source\repos\Portal\src\webapi\Controllers\JobsController.cs:line 188

Verbose output


EF Core version

9.0.2

Database provider

Microsoft.EntityFrameworkCore.SqlServer

Target framework

.Net 8

Operating system

No response

IDE

No response

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions