使用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 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-case并且不使用前缀,因此驱动程序设计者显然决定 强制将Id属性映射到_id数据库属性

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

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

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

  BsonClassMap.RegisterClassMap(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; }