微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在带有 MongoDb 的 C# 中,如何更新包含 JObject 的 POCO?

如何解决在带有 MongoDb 的 C# 中,如何更新包含 JObject 的 POCO?

在后端,我们有以下模型:

    public record RoofDesign
    {
        public int CountOfPanels { get; init; }
        public RoofDesignImages? Images { get; init; }
        public JObject? EditorData { get; init; }
    }

最终用户将在前端应用程序中设计屋顶。 除了完成的设计之外,我们希望存储编辑器可以用来在以后继续设计会话的信息,可能在另一台计算机上。后端永远不会关心这些数据的内容,所以我们只保存一个JSON就足够了。

RoofDesign 对象包含在 PlanningProject 对象的数组中,我目前使用以下方法保存它:

        public PlanningProject UpdatePlanning(PlanningProjectUpdate projectUpdate,CancellationToken cancellationToken)
        {
            return Plannings.FindOneAndUpdate(
                filter: CreateFilterById<PlanningProject>(projectUpdate.Id),update: CreateUpdate(projectUpdate),options: new FindOneAndUpdateOptions<PlanningProject,PlanningProject>
                {
                    ReturnDocument = ReturnDocument.After
                },cancellationToken: cancellationToken
            );
        }

如果 EditorDataundefinednull,这可以正常工作。

然而,如果我给它一个值,我会得到一个意外的结果和一个异常。

例如,如果从值填充:

      "editorData": {
        "additionalProp1": [
          null
        ],"additionalProp2": [
          null
        ],"additionalProp3": [
          null
        ]
      }

... 在 MongoDb 记录中,保存如下:

            "EditorData" : {
                "additionalProp1" : {
                    "_t" : "JArray","_v" : [ 
                        {
                            "_t" : "JValue","_v" : []
                        }
                    ]
                },"additionalProp2" : {
                    "_t" : "JArray","additionalProp3" : {
                    "_t" : "JArray","_v" : []
                        }
                    ]
                }
            }

然后我收到如下错误

ystem.FormatException:反序列化 SoPE.Estimation.PlanningProject 类的 Roofs 属性时出错:反序列化 SoPE.Estimation.RoofDesign 类的 EditorData 属性时出错:调用目标已抛出异常。 ---> System.FormatException:反序列化 SoPE.Estimation.RoofDesign 类的 EditorData 属性时出错:调用目标已抛出异常。 ---> System.Reflection.TargetInvocationException:调用的目标已抛出异常。 ---> System.ArgumentException:无法确定 System.Collections.Generic.List1[Newtonsoft.Json.Linq.JToken]. at Newtonsoft.Json.Linq.JValue.GetValueType(Nullable1 当前类型的 JSON 对象类型,对象值) 在 Newtonsoft.Json.Linq.JValue..ctor(对象值) --- 内部异常堆栈跟踪结束 --- 在 System.RuntimeMethodHandle.InvokeMethod(Object target,Object[] arguments,Signature sig,Boolean constructor,Boolean wrapExceptions) 在 System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr,Binder binder,Object[] parameters,CultureInfo culture) 在 MongoDB.Bson.Serialization.Serializers.EnumerableInterfaceImplementerSerializer2.FinalizeResult(Object accumulator) at MongoDB.Bson.Serialization.Serializers.EnumerableSerializerBase2.Deserialize(BsonDeserializationContext context,BsonDeserializationArgs args) 在 MongoDB.Bson.Serialization.Serializers.SerializerBase1.MongoDB.Bson.Serialization.IBsonSerializer.Deserialize(BsonDeserializationContext context,BsonDeserializationArgs args) at MongoDB.Bson.Serialization.Serializers.discriminatedWrapperSerializer1.c__displayClass6_0.b__0(String elementName,Int64 flag) 在 MongoDB.Bson.Serialization.Serializers.SerializerHelper.DeserializeMembers(BsonDeserializationContext context,Action2 memberHandler) at MongoDB.Bson.Serialization.Serializers.discriminatedWrapperSerializer1.Deserialize(BsonDeserializationContext context,BsonDeserializationArgs args) 在 MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize[TValue](IBsonSerializer1 serializer,BsonDeserializationContext context) at MongoDB.Bson.Serialization.Serializers.EnumerableSerializerBase2.Deserialize(BsonDeserializationContext context,BsonDeserializationContext context) at MongoDB.Bson.Serialization.Serializers.DictionarySerializerBase3.DeserializeDocumentRepresentation(BsonDeserializationContext context) 在 MongoDB.Bson.Serialization.Serializers.DictionarySerializerBase3.DeserializeValue(BsonDeserializationContext context,BsonDeserializationArgs args) at MongoDB.Bson.Serialization.Serializers.ClassSerializerBase1.Deserialize(BsonDeserializationContext context,BsonDeserializationArgs args) at MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize(IBsonSerializer serializer,BsonDeserializationContext context) at MongoDB.Bson.Serialization.BsonClassMapSerializer1.DeserializeMemberValue(BsonDeserializationContext context,BsonMemberMap memberMap) --- 内部异常堆栈跟踪结束 --- 在 MongoDB.Bson.Serialization.BsonClassMapSerializer1.DeserializeMemberValue(BsonDeserializationContext context,BsonMemberMap memberMap) at MongoDB.Bson.Serialization.BsonClassMapSerializer1.DeserializeClass(BsonDeserializationContext context) 在 MongoDB.Bson.Serialization.BsonClassMapSerializer1.Deserialize(BsonDeserializationContext context,BsonDeserializationArgs args) at MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize[TValue](IBsonSerializer1 序列化器,BsonDeserializationContext 上下文) 在 MongoDB.Bson.Serialization.Serializers.EnumerableSerializerBase2.Deserialize(BsonDeserializationContext context,BsonDeserializationArgs args) at MongoDB.Bson.Serialization.Serializers.SerializerBase1.MongoDB.Bson.Serialization.IBsonSerializer.Deserialize(BsonDeserializationContext context,BsonDeserializationArgs args) 在 MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize(IBsonSerializer serializer,BsonDeserializationContext context) 在 MongoDB.Bson.Serialization.BsonClassMapSerializer1.DeserializeMemberValue(BsonDeserializationContext context,BsonMemberMap memberMap) --- End of inner exception stack trace --- at MongoDB.Bson.Serialization.BsonClassMapSerializer1.DeserializeMemberValue(BsonDeserializationContext context,BsonMemberMap memberMap) 在 MongoDB.Bson.Serialization.BsonClassMapSerializer1.DeserializeClass(BsonDeserializationContext context) at MongoDB.Bson.Serialization.BsonClassMapSerializer1.Deserialize(BsonDeserializationContext context,BsonDeserializationContext context) at MongoDB.Driver.Core.Operations.ElementDeserializer1.Deserialize(BsonDeserializationContext context,BsonDeserializationContext context) at MongoDB.Driver.Core.Operations.FindAndModifyValueDeserializer1.Deserialize(BsonDeserializationContext context,BsonDeserializationContext context) at MongoDB.Driver.Core.Operations.FindAndModifyOperationBase1.ProcessCommandResult(ConnectionId connectionId,RawBsonDocument rawBsonDocument) 在 MongoDB.Driver.Core.Operations.FindAndModifyOperationBase1.ExecuteAttempt(RetryableWriteContext context,Int32 attempt,Nullable1 transactionNumber,CancellationToken CancellationToken) 在 MongoDB.Driver.Core.Operations.RetryableWriteOperationExecutor.Execute[TResult](IRetryableWriteOperation1 operation,RetryableWriteContext context,CancellationToken cancellationToken) at MongoDB.Driver.Core.Operations.RetryableWriteOperationExecutor.Execute[TResult](IRetryableWriteOperation1 操作,IWriteBinding 绑定,布尔值 retryRequested,CancellationToken 取消令牌) 在 MongoDB.Driver.Core.Operations.FindAndModifyOperationBase1.Execute(IWriteBinding binding,CancellationToken cancellationToken) at MongoDB.Driver.OperationExecutor.ExecuteWriteOperation[TResult](IWriteBinding binding,IWriteOperation1 操作,CancellationToken 取消令牌) 在 MongoDB.Driver.MongoCollectionImpl1.ExecuteWriteOperation[TResult](IClientSessionHandle session,IWriteOperation1 操作中,CancellationToken 取消令牌) 在 MongoDB.Driver.MongoCollectionImpl1.FindOneAndUpdate[TProjection](IClientSessionHandle session,FilterDeFinition1 个过滤器、UpdateDeFinition1 update,FindOneAndUpdateOptions2 个选项、CancellationToken 取消令牌) 在 MongoDB.Driver.MongoCollectionImpl1.<>c__displayClass57_01.b__0(IClientSessionHandle session) 在 MongoDB.Driver.MongoCollectionImpl1.UsingImplicitSession[TResult](Func2 func,CancellationToken CancellationToken) 在 MongoDB.Driver.MongoCollectionImpl1.FindOneAndUpdate[TProjection](FilterDeFinition1 个过滤器、UpdateDeFinition1 update,FindOneAndUpdateOptions2 个选项、CancellationToken 取消令牌) 在 C:\projects\SOPE\sope-api\SolarPanelEstimation.Mongo\DbContext.cs:line 105 中的 SoPE.DbContext.UpdatePlanning(PlanningProjectUpdate projectUpdate,CancellationToken cancelationToken) 在 C:\projects\SOPE\sope-api\SolarPanelEstimation.Mongo\Estimation\MongoSolarPanelEstimationService.cs:line 186 在 C:\projects\SOPE\sope-api\SolarPanelEstimation.Api\Controllers\V1_0\PlanningsController.cs:line 90 中的 SoPE.Controllers.V1_0.PlanningsController.UpdatePlanning(String id,UpdatePlanningProjectRequest 模型,CancellationToken CancellationToken) 在 lambda_method542(Closure,Object ) 在 Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.AwaitableObjectResultExecutor.Execute(IActionResultTypeMapper mapper,ObjectMethodExecutor executor,Object controller,Object[] arguments) 在 Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|12_0(ControllerActionInvoker invoker,ValueTask`1 actionResultValueTask) 在 Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.g__Awaited|10_0(ControllerActionInvoker 调用者,任务上一个任务,下一个状态,作用域范围,对象状态,布尔值已完成) 在 Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context) 在 Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next,Scope& scope,Object& state,Boolean& isCompleted) 在 Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterasync() --- 从上一个位置开始的堆栈跟踪结束 --- 在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|24_0(ResourceInvoker invoker,Task lastTask,State next,Scope scope,Object state,Boolean isCompleted) 在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context) 在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next,Boolean& isCompleted) 在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync() --- 从上一个位置开始的堆栈跟踪结束 --- 在 Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.g__Awaited|17_0(ResourceInvoker 调用者,任务任务,Idisposable 范围) 在 Microsoft.AspNetCore.Routing.EndpointMiddleware.g__AwaitRequestTask|6_0(Endpoint endpoint,Task requestTask,ILogger logger) 在 Microsoft.AspNetCore.Authorization.Policy.AuthorizationMiddlewareResultHandler.HandleAsync(RequestDelegate next,HttpContext context,AuthorizationPolicy policy,PolicyAuthorizationResult authorizeResult) 在 Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext 上下文) 在 Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext 上下文) 在 Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext) 在 Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext,ISwaggerProvider swaggerProvider) 在 Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

有什么想法可以解决这个问题吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。