将BsonArray映射到列表<>;在POCO中

本文关键字:POCO gt lt 映射 列表 BsonArray | 更新日期: 2023-09-27 18:29:48

我使用本教程学习如何将Mongo数据库中的文档映射到POCO对象。

我的文档设置如下:

{
  "VehicleEntry" : [
      {
          "BatteryStatus" : "GOOD",
          "VehicleStatus" : "PASSED"
      }, 
      {
          "BatteryStatus" : "GOOD",
          "VehicleStatus" : "PASSED"
      }
  ],
  "project_id" : "1234"
}

要注意的主要一点是,我在每个文档中都有一个名为VehicleEntry的数组。我已经设置了POCO来匹配这样的文档:

public class VehicleEntry : MongoEntity
{
    [BsonElement("@Date")]
    public String Date { get; set; }
    [BsonElement("@Time")]
    public String Time { get; set; }
    [BsonElement("@Vin")]
    public String Vin { get; set; }
    [BsonElement("@Year")]
    public String Year { get; set; }
    [BsonElement("@Body")]
    public String Body { get; set; }
    [BsonExtraElements]
    public BsonDocument ExtraElements { get; set; }
}
public class VehicleDataUpload : MongoEntity
{
    public VehicleDataUpload()
    {
        VehicleEntries = new List<VehicleEntry>();
    }
    [BsonElement("project_id")]
    public String ProjectId { get; set; }
    [BsonElement("VehicleEntry")]
    public List<VehicleEntry> VehicleEntries { get; set; }
    [BsonExtraElements]
    public BsonDocument ExtraElements { get; set; }
}

为了测试这一点,我写了一行简单的代码,用来查找第一个具有给定项目标识符的文档:

var collection = database.GetCollection<VehicleDataUpload>("vehicleCollection");
var firstProj = collection.AsQueryable().Where(i => i.ProjectId.Equals("myProjIdentifier")).First();

然而,当我运行它时,我会得到以下异常:

附加信息:反序列化类CARSMongoTest.VehicleDataUpload的VehicleEntries属性时出错。无法从BsonType"Document"反序列化"List"。

我认为这是非常直接的,因为VehicleEntry的类型无法转换为List<>对象,但我不确定如何做到这一点。我有点困惑,为什么它在错误消息中说类型为"Document",而它应该将VehicleEntry视为Array类型。

如何将数组映射到POCO的属性?

编辑我尝试过更改VehicleEntry,使其不从MongoEntity扩展,但错误仍然存在。

将BsonArray映射到列表<>;在POCO中

嗯,我意识到失败的原因是我端的一个错误。我们的大多数项目都会有多个vehicle条目,但碰巧我测试的那个项目在XML中只有一个,所以反序列化将其转换为Document,而不是BsonArray。

上面的代码会起作用,假设VehicleEntry字段实际上是BsonArray类型,驱动程序会将其映射到List对象。