我有一个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; }