C#ASP.NET API:设置MongoDb ID

C#ASP.NET API:设置MongoDb ID,c#,asp.net,mongodb,api,C#,Asp.net,Mongodb,Api,我正在尝试使用MongoDb设置一个ASP.NET API作为我的数据库,目前我正在尝试将JSON对象插入到我的数据库中。但由于某些原因,我无法为我的数据库设置自定义ID 如果我让MongoDb自动生成一个ID,没有问题,我可以简单地将JSON对象放入数据库: {"_id":"5db0b2cf6abcc72fa42c8991","id":"pand3d.8575483","type":"Feature","geometry":{"type":"Polygon","coordinates":[[[

我正在尝试使用MongoDb设置一个ASP.NET API作为我的数据库,目前我正在尝试将JSON对象插入到我的数据库中。但由于某些原因,我无法为我的数据库设置自定义ID

如果我让MongoDb自动生成一个ID,没有问题,我可以简单地将JSON对象放入数据库:

{"_id":"5db0b2cf6abcc72fa42c8991","id":"pand3d.8575483","type":"Feature","geometry":{"type":"Polygon","coordinates":[[[108665.593,447232.925,0],[108667.648,447229.102,0],[108676.807,447234.217,0],[108674.334,447238.579,0],[108665.593,447232.925,0]]]},"geometry_name":"geovlak","properties":{"gid":8575483,"identificatie":"0513100011121832","aanduidingrecordinactief":false,"aanduidingrecordcorrectie":0,"officieel":false,"inonderzoek":false,"documentnummer":"BAGAV1776","documentdatum":"2018-08-15Z","bouwjaar":"1900-01-01Z","begindatumtijdvakgeldigheid":"2018-08-14T22:00:00Z","einddatumtijdvakgeldigheid":null,"gemeentecode":"0513","ground-000":"-0.44","ground-010":"-0.42","ground-020":"-0.41","ground-030":"-0.41","ground-040":"-0.4","ground-050":"-0.39","roof-025":"2.72","roof-050":"2.81","roof-075":"3.03","roof-090":"4.76","roof-095":"7.04","roof-099":"9.72","rmse-025":"0.87","rmse-050":"0.62","rmse-075":"0.62","rmse-090":"0.62","rmse-095":"0.62","rmse-099":"0.62","roof_flat":false,"nr_ground_pts":12,"nr_roof_pts":1247,"ahn_file_date":"2014-02-25T23:00:00Z","ahn_version":3,"height_valid":true,"tile_id":"38an2","bbox":["108665.593","447229.102","108676.807","447238.579"]}}
但正如您所看到的,它生成了一个{“_id”:“5db0b2cf6abcc72fa42c8991}作为id。但是我希望{“id”:“pand3d.8575483}作为id

所以我做了这个模型:

 public class Bag3DMember
{
    [BsonId]
    [DataMember]
    [BsonElement("id")]
    public string Id { get; set; }

    [DataMember]
    [BsonElement("type")]
    public string Type { get; set; }

    [BsonElement("geometry")]
    public Geometry Geometry { get; set; }

    [BsonElement("geometry_name")]
    public string GeometryName { get; set; }

    [BsonElement("properties")]
    public Properties Properties { get; set; }

}
但当我将JSON对象插入数据库时,会收到以下错误消息:

System.FormatException:“元素“id”与EnveoApi.Bag3DMember类的任何字段或属性都不匹配。”

编辑1:

因此,我将模型更改为:

   public class Bag3DMember
{
    [BsonId]
    [DataMember]
    [BsonElement("_id")]
    public string _Id { get; set; }

    [DataMember]
    [BsonElement("type")]
    public string Type { get; set; }

    [BsonElement("geometry")]
    public Geometry Geometry { get; set; }

    [BsonElement("geometry_name")]
    public string GeometryName { get; set; }

    [BsonElement("properties")]
    public Properties Properties { get; set; }

}
但仍然得到相同的错误,使用此stacktrace:

   at MongoDB.Bson.Serialization.BsonClassMapSerializer`1.DeserializeClass(BsonDeserializationContext context)
在MongoDB.Bson.Serialization.BsonClassMapSerializer
1.Deserialize(BsonDeserializationContext,BsonDeserializationArgs args args)
在MongoDB.Bson.Serialization.ibsonSerialization.Deserialize[TValue](IBsonSerializer
1序列化器,BsonDeserializationContext) 在MongoDB.Bson.Serialization.Serializers.EnumerableSerializerBase
2.反序列化(BsonDeserializationContext,BsonDeserializationArgs args args)
在MongoDB.Bson.Serialization.ibsonSerialization.Deserialize[TValue](IBsonSerializer
1序列化器,BsonDeserializationContext) 在MongoDB.Bson.Serialization.Serializers.ImpliedImplementationInterfaceSerializer
2.反序列化(BsonDeserializationContext,BsonDeserializationArgs args args)
在MongoDB.Bson.Serialization.ibsonSerialization.Deserialize[TValue](IBsonSerializer
1序列化器,BsonDeserializationContext) 在MongoDB.Bson.Serialization.BsonSerializer.Deserialize[TNominalType](IBsonReader-bsonReader,Action
1配置程序)
在MongoDB.Bson.Serialization.BsonSerializer.Deserialize[TNominalType](字符串json,操作
1配置器) 在D:\GitRepo\EnveoApi\Services\Bag3DService.cs中的EnveoApi.Services.Bag3DService.SetupTestData()处:第42行 在D:\GitRepo\EnveoApi\Services\Bag3DService.cs中的EnveoApi.Services.Bag3DService..ctor(IBag3DMemberDatabaseSettings设置)处:第32行 在System.RuntimeMethodHandle.InvokeMethod(对象目标、对象[]参数、签名符号、布尔构造函数、布尔WrapeExceptions) 在System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr、Binder Binder、Object[]参数、CultureInfo区域性) 位于Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite ConstructorCallSite,RuntimeResolverContext上下文) 位于Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor
2.VisitCallSiteMain(ServiceCallSite callSite,Target参数)
在Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite callSite、RuntimeResolverContext上下文、ServiceProviderEngineScope serviceProviderEngine、RuntimeResolverLockType)
位于Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitrotCache(ServiceCallSite singletonCallSite,RuntimeResolverContext上下文)
位于Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor
2.VisitCallSite(ServiceCallSite callSite,Target参数) 位于Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(ServiceCallSite callSite,ServiceProviderEngineScope作用域) 在Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine.c__DisplayClass1_0.b__0(ServiceProviderEngineScope作用域) 在Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(输入serviceType,ServiceProviderEngineScope ServiceProviderEngineScope) 位于Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(类型serviceType) 位于Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp,类型类型,类型requiredBy,布尔值isDefaultParameterRequired) 在Microsoft.AspNetCore.Mvc.Controllers.ControllerActivatorProvider.c__显示Class4_0.b__0(ControllerContext ControllerContext) 在Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.c_uuDisplayClass5_0.g_uCreateController | 0(ControllerContext ControllerContext) 位于Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(状态和下一步、范围和范围、对象和状态、布尔值和isCompleted)
在Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()

请尝试以下操作并回复

public class Bag3DMember
{
    [BsonId]
    [DataMember]
    [BsonElement("_id")]
    public string _Id { get; set; }

    [DataMember]
    [BsonElement("type")]
    public string Type { get; set; }

    [BsonElement("geometry")]
    public Geometry Geometry { get; set; }

    [BsonElement("geometry_name")]
    public string GeometryName { get; set; }

    [BsonElement("properties")]
    public Properties Properties { get; set; }

}

在您的代码中,将对
Bag3DMember.id
的引用更改为
Bag3DMember.\u id

因此我想我有一个解决方案

感谢barrypicker指出我的应用程序在反序列化而不是序列化方面遇到困难,我认为这可能是因为:

这里,我的JSON id属性与我的模型(序列化)不匹配

但在这里,我的id JSON属性与我的模型匹配。但是当MongoDb插入它时,它将ID重命名为_ID,这意味着我的模型也不匹配(反序列化)

因此tldr:我编写了一个函数,在插入之前将JSON键“id”更改为“\u id”。
谢谢你,巴里皮克

您是否尝试将“id”引用为“\u id”?我仍在获取System.FormatException:“元素“id”与类EnveoApi.Bag3DMember的任何字段或属性不匹配。我仍在获取System.FormatException:“元素“id”与类EnveoApi.Bag3DMember的任何字段或属性不匹配。嗯,您确定应用了代码更改吗?现在应该没有名为“id”的元素。。。特别是查看
[bsonelement(“\u id”)]
您能提供堆栈跟踪和完整的错误消息吗?查看堆栈跟踪,它很难进行反序列化,而不是序列化。我相信
[BsonId]
[DataMember]
[BsonElement("_id")]
public string _Id { get; set; }
 [BsonId]
[DataMember]
[BsonElement("id")]
public string Id { get; set; }