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

时间:2011-06-29 16:07:29

标签: c# mongodb mongodb-.net-driver

我有一个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”)]属性,但它没有帮助。

3 个答案:

答案 0 :(得分:14)

MongoDB文档explicitly states

  

MongoDB中的文档需要有一个密钥_id,该密钥可以唯一标识它们。

另一方面,C#属性通常是pascal-case并且不使用前缀,因此驱动程序设计者apparently decided强制将Id属性映射到_id数据库属性< /强>

如果要绑定非_id属性,只有恰好在MongoDB中调用Id ,您可以声明另一个名称不是{的C#属性{1}}因此驱动程序不会干扰它:

Id

答案 1 :(得分:2)

我同意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
            });

答案 2 :(得分:1)

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

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