如何在将 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 属性,但不起作用。

如何在将 POCO 与 MongoDB C# 驱动程序一起使用时管理_id字段

插入对象时,如果它没有_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 属性。