Maintain Id property name in embedded doc with mongo C# driver

試著忘記壹切 提交于 2019-12-06 23:36:52

问题


I have a mongo document that contains an array of embedded documents. The embedded documents have a property named "Id".

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

My C# mapping objects look something like this (a simplification, obviously)

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; }
}

When I write an outer to the database, the C# driver changes the name of the Inner.Id property to _id. How do I circumvent this automatic rename? I've tried using the [BsonElement("Id")] attribute on the Id property, but it didn't help.


回答1:


MongoDB documentation explicitly states:

Documents in MongoDB are required to have a key, _id, which uniquely identifies them.

On the other hand, C# properties are usually pascal-case and don't use prefixes so driver designers apparently decided to force mapping Id property to _id database attribute.

If you want to bind a non-_id attribute that just happens to be called Id in MongoDB, you could declare another C# property with a name other than Id so the driver doesn't interfere with it:

public class Inner
{
    public string Name { get; set; }

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



回答2:


I agree with Dan's answer, but in some cases if you're not allowed to change the "Id" property to something else, you may explicitly change the behavior in class maps like below.

            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
            });



回答3:


I can't comment so will write new answer. My notes will save a lof of time for people. If your _id in mongodb is ObjectID type then in C# you need to add some more attributes:

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


来源:https://stackoverflow.com/questions/6523742/maintain-id-property-name-in-embedded-doc-with-mongo-c-sharp-driver

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!