2011-06-29 11 views
8

Tengo un documento mongo que contiene una matriz de documentos incrustados. Los documentos incrustados tienen una propiedad llamada "Id".Mantener el nombre de la propiedad Id en el documento incrustado con el controlador mongo C#

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

Mi C# mapeo de objetos a ver algo como esto (una simplificación, obviamente)

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

Cuando escribo una combinación externa a la base de datos, el C# conductor cambia el nombre de la propiedad Inner.Id a _carné de identidad. ¿Cómo evito este cambio de nombre automático? Intenté usar el atributo [BsonElement ("Id")] en la propiedad Id, pero no me ayudó.

Respuesta

11

documentación MongoDB explicitly states:

documentos en MongoDB están obligados a tener una llave, _id, lo que les identifica de manera única.

Por otra parte, C# propiedades son por lo general Pascal caso y no utilizan prefijos para que los diseñadores conductor apparently decided a mapeo fuerza atributo Id propiedad a la base de datos _id.

Si desea enlazar un atributo no _id que acaba pasa a llamarse Id en MongoDB, se podría declarar otro C# propiedad con un nombre que no sea Id para que el conductor no interfiere con él:

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

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

Esto es sólo mi suposición, sin embargo. Nunca usé MongoDB yo mismo. –

+1

Cambié el nombre de la propiedad a IdStr y agregué el atributo [BsonElement ("Id")] a la propiedad. Eso funciono. ¡Gracias! –

+0

Gracias por esta respuesta. Explica un problema que hemos estado persiguiendo hoy. No importa cómo anules el mapa. Qué d-move de su parte. : / –

1

No puedo comentar, así que escribiré una nueva respuesta. Mis notas ahorrarán un montón de tiempo para las personas. Si su _id en mongodb es el tipo de objeto a continuación, en C# es necesario agregar algunos atributos más:

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

Estoy de acuerdo con la respuesta de Dan, pero en algunos casos, si no se le permite cambiar la propiedad "ID" a otra cosa, puede cambiar explícitamente el comportamiento en los mapas de clase como a continuación.

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