C#when自定义id字段中的MongoDB反序列化
数据库中有以下结构:C#when自定义id字段中的MongoDB反序列化,c#,mongodb,poco,C#,Mongodb,Poco,数据库中有以下结构: { "_id" : ObjectId(""), "title" : "something", "id" : 1, (...) } 基本上,我希望将以下集合中的数据检索到我的类: [BsonIgnoreExtraElements] public class Topic { [BsonElement("id")] public int Id { get; set; } [BsonElement("titl
{
"_id" : ObjectId(""),
"title" : "something",
"id" : 1,
(...)
}
基本上,我希望将以下集合中的数据检索到我的类:
[BsonIgnoreExtraElements]
public class Topic
{
[BsonElement("id")]
public int Id { get; set; }
[BsonElement("title")]
public string Name { get; set; }
}
问题是此代码不工作->执行时出现错误消息:
无法从BsonType“ObjectId”反序列化“Int32”,
但这一个是:
[BsonIgnoreExtraElements]
public class Topic
{
[BsonIgnore]
public int Id { get; set; }
[BsonElement("title")]
public string Name { get; set; }
[BsonElement("id")]
public int IdTest { get; set; }
似乎反序列化拼命尝试将名为“Id”的类属性与数据库中的ObjectId相匹配,这是不正确的,因为我明确声明要将其与bsoneElement(“Id”)相匹配,而不是(“\u Id”)
我很感激任何能让它按我需要的方式工作的想法。我最后做了以下几点:
public class Topic
{
public int Id { get; set; }
public string Name { get; set; }
}
[BsonIgnoreExtraElements]
public class TopicMapper
{
[BsonElement("title")]
public string Name { get; set; }
[BsonElement("id")]
public int Identity { get; set; }
}
这是:
var list = await col.Find(new BsonDocument()).ToListAsync().ConfigureAwait(false);
foreach(var doc in list)
{
if(doc.Name != null)
topics.Add(new Topic{
Id = doc.Identity,
Name = doc.Name
});
}
mongo文档中存储的“_id”的类型为BsonType.ObjectId,因此在反序列化时,序列化程序会尝试查找名为“id”且类型为ObjectId的属性。在您的例子中,它找到了匹配的名称,但不是正确的类型,即int(类中的int32类型):我的建议是更改
public int Id { get; set; }
到
或
或者,如果使用MongoRepository,则使您的类继承自类实体:
[BsonIgnoreExtraElements]
public class Topic : Entity
{
[BsonElement("title")]
public string Name { get; set; }
}
public ObjectId Id { get; set; }
[BsonIgnoreExtraElements]
public class Topic : Entity
{
[BsonElement("title")]
public string Name { get; set; }
}