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