簡體   English   中英

C# gRpc ProtoBuf 創建復雜消息與子重復,拋出 Object 參考未設置異常

[英]C# gRpc ProtoBuf creating complex message with child repeated, throws Object Reference not set Exception

我是從 gRPC 開始的,除了消息構建的小問題外,一切都很完美:(

如果我使用標准 C# 類執行相同的代碼,那么一切正常。

不知道為什么會出現這個錯誤,還在調查中

Grpc.AspNetCore.Server.ServerCallHandler[6]
  Error when executing service method 'GetCars'.
  System.NullReferenceException: Object reference not set to an instance of an object.
     at Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.MatchTypes(Expression expression, Type targetType)
     at Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.Translate(SelectExpression selectExpression, Expression expression)
     at Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.TranslateSelect(ShapedQueryExpression source, LambdaExpression selector)
     at Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
     at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor)
     at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
     at Microsoft.EntityFrameworkCore.Query.QueryCompilationContext.CreateQueryExecutor[TResult](Expression query)
     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__DisplayClass9_0`1.<Execute>b__0()
     at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQuery[TResult](Object cacheKey, Func`1 compiler)
     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 Google.Protobuf.Collections.RepeatedField`1.AddRange(IEnumerable`1 values)
     at Google.Protobuf.Collections.RepeatedField`1.Add(IEnumerable`1 values)
     at RpcService.CarInfoRpcService.GetCars(RpcCarRequest request, ServerCallContext context) in C:\GitRepo\src\Services\CarInfo.gRpcService\Services\CarInfoRpcService.cs:line 75
     at Grpc.Shared.Server.UnaryServerMethodInvoker`3.Invoke(HttpContext httpContext, ServerCallContext serverCallContext, TRequest request)
  --- End of stack trace from previous location ---
     at Grpc.AspNetCore.Server.Internal.CallHandlers.UnaryServerCallHandler`3.HandleCallAsyncCore(HttpContext httpContext, HttpContextServerCallContext serverCallContext)
     at Grpc.AspNetCore.Server.Internal.CallHandlers.ServerCallHandlerBase`3.<HandleCallAsync>g__AwaitHandleCall|8_0(HttpContextServerCallContext serverCallContext, Method`2 method, Task handleCall)



var queryResult = dbContext.Cars
                   .AsNoTracking()
                   .Select(car => new RpcCarInfo()
                   {
                       CarId = car.CarId,
                       CarOwners = { car.Owner.Select(el => new RpcCarOwner() { Name = el.Name }) }
                   });

                return Task.FromResult(new RpcCarInfoResponse()
                {
                    Cars = { queryResult }
                });

我是這樣做的

        var queryResult = dbContext.Cars.AsNoTracking().ToList();

        var carsInfo = queryResult.Select(car => new RpcCarInfo()
        {
            CarId = car.CarId,
            CarOwners = { car.Owner.Select(el => new RpcCarOwner() { Name = el.Name }).ToList() }
        }).ToList();

        return Task.FromResult(new RpcCarResponse()
        {
            CarsInfo = { carsInfo }
        });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM