使用mongo C#驱动程序维护嵌入文档中的Id属性名称



我有一个mongo文档,它包含一个嵌入文档数组。嵌入的文档具有名为"Id"的属性。

{ Name: "Outer object", Embedded: [ {Name: "Embedded A", Id: "5f1c591a71dc237199eeaeda"} ] }

我的C#映射对象看起来像这样(显然是一种简化)

public class Outer
{
    public string Name { get; set; }
    public IEnumerable<Inner> Inners { get; set; }
}
public class Inner
{
    public string Name { get; set; }
    public string Id { get; set; }
}

当我向数据库写入一个外部时,C#驱动程序会将Inner.Id属性的名称更改为_Id。如何规避此自动重命名?我曾尝试在Id属性上使用[BsonElement("Id")]属性,但没有帮助。

MongoDB文档明确指出:

MongoDB中的文档需要有一个唯一标识它们的密钥_id

另一方面,C#属性通常是pascal大小写,不使用前缀,因此驱动程序设计者显然决定强制将Id属性映射到_id数据库属性

如果您想绑定一个非_id属性,而该属性恰好在MongoDB中被称为Id,那么您可以用Id以外的名称声明另一个C#属性,这样驱动程序就不会干扰它:

public class Inner
{
    public string Name { get; set; }
    [BsonElement("Id")]
    public string IdStr { get; set; }
}

我同意Dan的回答,但在某些情况下,如果不允许将"Id"属性更改为其他属性,则可以显式更改类映射中的行为,如下所示。

            BsonClassMap.RegisterClassMap<Inner>(cm =>
            {
                cm.AutoMap();
                cm.UnmapProperty(c => c.Id);
                cm.MapMember(c => c.Id)
                    .SetElementName()
                    .SetOrder(0) //specific to your needs
                    .SetIsRequired(true); // again specific to your needs
            });

我不能发表评论,所以将编写新的答案。我的笔记会为人们节省很多时间。如果你在mongodb中的_id是ObjectID类型,那么在C#中你需要添加更多的属性:

[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
[BsonElement("Id")]
public string Subject { get; set; }

最新更新