如何在将 POCO 与 MongoDB C# 驱动程序一起使用时管理_id字段
本文关键字:管理 字段 id 一起 驱动程序 POCO MongoDB | 更新日期: 2023-09-27 17:57:05
如果我想用 POCO 读写 mongo 数据
public class Thingy
{
public string Foo {get;set;}
}
...
coll.Insert(new Thing(Foo = "hello"));
当我回读时,我得到一个失败,说_id是一个意外的属性(确实如此)。因此,我向类中添加了一个名为_id的字段。现在插入不起作用,说_id字段不能为空。尝试过 BsonIgnoreIfNull 属性,但不起作用。
插入对象时,如果它没有_id
字段,则驱动程序添加一个字段并将其设置为 12 字节的 MongoDB ObjectId 值。
您只需要将一个 Id
属性添加到您的 POCO,该属性将从 _id
反序列化:
public class Thingy
{
public ObjectId Id { get; set; }
}
或者,如果您想委托另一个属性映射到_id
那么您可以使用 BsonIdAttribute
来装饰它,如下所示:
[BsonId]
public ObjectId MyKey { get; set; }
_id
字段不必是MongoDB ObjectId
,您可以将其设置为任何数据类型的任何值(数组除外),它只需要在集合中是唯一的。
您必须为 id 添加一个属性(或字段),并告诉序列化程序您想要使用哪个 id 生成器。
[BsonId(IdGenerator = typeof(ObjectIdGenerator))]
public object ThingyId { get; set; }
MongoDb 驱动程序中有 3 个可用,或者您可以编写自己的驱动程序。更多信息请访问 http://www.mongodb.org/display/DOCS/CSharp+Driver+Serialization+Tutorial#CSharpDriverSerializationTutorial-WriteacustomIdgenerator
我通常包装Thingy:
public class MongoThingy
{
public ObjectId Id { get; set; }
public Thingy Thingy { get; set; }
}
它使它变得容易得多,因为通常类 Thingy 来自我无法控制的不同库。反序列化也更容易,以便将其交给其他人进行处理。
添加属性,如下所示:
public BsonObjectId Id { get; set; }
MongoDB 驱动程序在序列化''反序列化期间自动将Id
转换为_id
。
public class Thingy
{
public ObjectId Id { get; set; }
public string Foo { get; set; }
}
按等级
如果需要,请使用以下代码:
var collection = database.GetCollection<Thingy>("db_Thingy");
Thingy tg= new Thingy();
tg.Foo = "Hello";
collection.insert(tg);
https://learn.microsoft.com/pt-br/aspnet/core/tutorials/first-mongo-app?view=aspnetcore-5.0&tabs=visual-studio 的方式
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
namespace BooksApi.Models
{
public class Book
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
[BsonElement("Name")]
public string BookName { get; set; }
(...)
}
}
正如Chris Christopher在上面的评论中所建议的那样,您可以使用类属性BsonIgnoreExtraElements
:
[BsonIgnoreExtraElements]
public class Thingy
{
public string Foo { get; set; }
}
这样,您就不必添加具有其他 BSon
属性的 Id 属性。