Overview
En esta guía, puedes aprender cómo personalizar la manera en que el controlador MongoDB .NET/C# mapea documentos BSON hacia y desde clases C#. Lee esta página para obtener más información sobre el comportamiento de mapeo de clase por defecto, o si debes personalizar la manera en que el driver serializa o deserializa tus datos.
También puedes usar atributos POCO para configurar el comportamiento de la serialización. Para obtener más información, consulta el POCOs guide.
Mapeo automático de clases
Cuando utilizas una clase, en lugar de un(a) BsonDocumentPara representar datos en una colección de MongoDB, el controlador .NET/C# crea automáticamente un mapa de clases que se utiliza para serializar o deserializar los datos. Se realiza este mapeo haciendo coincidir el nombre del campo en el documento con el nombre de la propiedad en la clase.
Importante
Haga coincidir el tipo de la propiedad en su clase con el tipo del campo en el documento. El controlador .NET/C# crea una instancia de un serializador basado en el tipo de la propiedad en su clase. Si los tipos no coinciden cuando el controlador intenta deserializar los datos, el serializador lanza una excepción.
Creación manual de un mapa de clase
Puedes omitir la funcionalidad de asignación de clases automática del driver y definir manualmente el mapa de clases utilizando el método RegisterClassMap().
El siguiente ejemplo define una clase de Person:
public class Person { public string Name { get; set; } public int Age { get; set; } public List<string> Hobbies {get; set;} }
El siguiente código demuestra cómo registrar el mapa de clases para la clase Person:
BsonClassMap.RegisterClassMap<Person>(classMap => { classMap.MapMember(p => p.Name); classMap.MapMember(p => p.Age); classMap.MapMember(p => p.Hobbies); });
Importante
Cuándo registrar un mapa de clases
Debe registrar un mapa de clase antes de que sea necesario en su código. Recomendamos registrar los mapas de clase antes de inicializar una conexión con MongoDB.
También puede asignar manualmente un subconjunto de propiedades de la clase, mientras permite que el controlador asigne automáticamente las propiedades restantes. Para hacer esto, registre un mapa de clases y llame al método AutoMap() antes de especificar manualmente sus propiedades.
En el siguiente ejemplo de código, el método AutoMap() asigna todas las propiedades de la clase Person y luego ajusta manualmente la asignación para el campo Hobbies:
BsonClassMap.RegisterClassMap<Person>(classMap => { classMap.AutoMap(); classMap.MapMember(p => p.Hobbies).SetElementName("favorite_hobbies"); });
Personalizar la serialización de clases
Puedes personalizar la forma en que el driver serializa y deserializa documentos a nivel de clase aplicando atributos a la clase o llamando métodos al registrar un mapa de clase.
Omitir campos
Puede evitar que se serialicen campos específicos utilizando el método UnmapMember() al registrar un mapa de clase.
El siguiente ejemplo muestra cómo crear un mapeo de clases para evitar que la propiedad Age se serialice:
BsonClassMap.RegisterClassMap<Person>(classMap => { classMap.AutoMap(); classMap.UnmapMember(p => p.Age); });
Tip
Para aprender cómo establecer este comportamiento usando un atributo de campo, consulta la sección Omit Fields de la guía POCOs.
Ignorar elementos extra
Cuando un documento BSON se deserializa a una clase en C#, el controlador .NET/C# examina el nombre de cada campo en el documento e intenta encontrar un nombre de propiedad coincidente en la clase. Por defecto, si un campo en el documento no tiene una coincidencia en la clase, el controlador lanza una excepción.
Se puede optar por ignorar cualquier elemento que no tenga una propiedad de clase coincidente utilizando el atributo BsonIgnoreExtraElements. Esto evita que el controlador arroje una excepción y asigna cualquier otro campo que tenga propiedades de clase coincidentes.
El siguiente ejemplo muestra cómo agregar un atributo BsonIgnoreExtraElements a una clase.
[] public class Person { public string Name { get; set; } public int Age { get; set; } public List<string> Hobbies {get; set;} }
También puedes ignorar cualquier elemento extra al registrar un mapa de clase:
BsonClassMap.RegisterClassMap<Person>(classMap => { classMap.AutoMap(); classMap.SetIgnoreExtraElements(true); });
Identificar el campo ID
Por defecto, el controlador mapea cualquier propiedad pública llamada Id, id o _id al campo BSON _id. Para seleccionar explícitamente la propiedad que se mapeará al campo _id, usa el método map de la clase MapIdMember().
El siguiente ejemplo de código asigna la propiedad Identifier al campo _id:
BsonClassMap.RegisterClassMap<Person>(classMap => { classMap.AutoMap(); classMap.MapIdMember(p => p.Identifier); });
string IDs
Si usas cadenas para representar la ID de tus documentos, puedes usar el método de mapeo de la clase IdMemberMap.SetSerializer() para serializar estos valores en instancias de ObjectId en MongoDB. De esta manera, puedes personalizar cómo se representan los valores de tu ID en tu aplicación, a la vez que sigues las mejores prácticas de MongoDB para la gestión de ID en la base de datos.
El siguiente ejemplo dirige al driver a serializar valores de ID de string como valores de ObjectId :
BsonClassMap.RegisterClassMap<Person>(classMap => { classMap.AutoMap(); classMap.IdMemberMap.SetSerializer(new StringSerializer(BsonType.ObjectId)); });
Si desea que el controlador genere cadenas hexadecimales válidas de 24dígitos para usar como valores de ID, puede encadenar el método SetIdGenerator() al método MapIdMember() y pasar una instancia de StringObjectIdGenerator:
BsonClassMap.RegisterClassMap<Person>(classMap => { classMap.AutoMap(); classMap.MapIdMember(p => p.Identifier).SetIdGenerator(StringObjectIdGenerator.Instance); });
Para obtener más información sobre los generadores de ID, consulte la sección Especificar un generador de ID de la guía de POCO.
ID de GUID
Si tu aplicación utiliza GUID como identificadores únicos en los documentos, puedes registrar un mapa de clases para especificar cómo se serializan los valores Guid. Por defecto, el controlador utiliza el tipo GuidGenerator para generar un valor único para la propiedad ID. Debes especificar la representación de GUID inicializando un GuidSerializer.
El siguiente código especifica la representación de GUID de Standard cuando se registra el mapa de clases:
BsonClassMap.RegisterClassMap<Person>(classMap => { classMap.AutoMap(); classMap.IdMemberMap.SetSerializer(new GuidSerializer(GuidRepresentation.Standard)); });
Para obtener más información sobre la serialización de GUID, consulte la guía de GUID.
Mapeo con constructores
Por defecto, el .NET/C# Driver solo puede mapear automáticamente una clase si esta tiene un constructor sin argumentos. Si deseas que el controlador use un constructor que acepte uno o más argumentos, puedes añadir el atributo BsonConstructor al constructor. En este caso, el driver examina los tipos para determinar cómo asignar los argumentos del constructor a las propiedades o campos de la clase.
Cuando el driver crea un mapa de clase para la siguiente clase Person, utilizará el constructor marcado con el atributo BsonConstructor. El argumento name se asignará a la propiedad Name y el argumento age se asignará a la propiedad Age.
public class Person { public string Name { get; set; } public int Age { get; set; } public List<string> Hobbies {get; set;} [] public Person(string name, string age) { Name = name; Age = age; } }
Tip
Múltiples atributos de BsonConstructor
Si hay más de un constructor con el atributo BsonConstructor, el controlador utiliza el constructor que tiene la mayor cantidad de parámetros con campos coincidentes en el documento.
También puede especificar el constructor que se utilizará cuando registre su mapa de clases:
public class Person { public string Name { get; set; } public int Age { get; set; } public List<string> Hobbies {get; set;} public Person(string name, string age) { Name = name; Age = age; } } BsonClassMap.RegisterClassMap<Person>(classMap => { classMap.AutoMap(); classMap.MapCreator(p => new Person(p.Name, p.Age)); });
Personalizar la serialización de propiedades
Se puede personalizar cómo el controlador serializa una propiedad de clase añadiendo atributos a la propiedad. Para obtener más información sobre la serialización de propiedades personalizadas, consulta Serialización personalizada.
Soporte de elementos extra
Puedes diseñar tu clase C# para almacenar cualquier elemento extra en tu documento que no tenga propiedades de clase correspondientes. Para ello, la clase debe tener una propiedad de tipo BsonDocument para guardar los elementos extra.
El siguiente código utiliza el atributo BsonExtraElements con la propiedad ExtraElements para indicar al driver que almacene elementos adicionales:
public class Person { public string Name { get; set; public int Age { get; set; } public List<string> Hobbies {get; set;} [] public BsonDocument ExtraElements {get; set;} }
También puedes admitir elementos extra al inicializar un mapa de clase de la siguiente manera:
BsonClassMap.RegisterClassMap<Person>(classMap => { classMap.AutoMap(); classMap.MapExtraElementsMember(p => p.ExtraElements); });
Nota
Después de que el controlador serializa una clase con elementos adicionales, al convertirla nuevamente a BSON, los elementos adicionales pueden no conservar el mismo orden que tenían en el documento original.
Serializar propiedades dinámicamente
Se puede utilizar un método para determinar si se debe serializar una propiedad. Para que el driver utilice automáticamente el método al serializar, se debe anteponer al nombre del método ShouldSerialize seguido del nombre de la propiedad a la que se aplica el método. Cuando el controlador ve un método con esta convención de nomenclatura, utiliza ese método para determinar si se deben serializar las propiedades que tengan el nombre de propiedad proporcionado.
El siguiente ejemplo crea un método que sólo serializa la propiedad Age si su valor no es igual a 0. El driver no serializa ninguna propiedad cuyos valores no cumplan este requisito:
public class Person { public string Name { get; set; } public int Age { get; set; } public List<string> Hobbies {get; set;} public bool ShouldSerializeAge() { return Age != 0; } }
También puedes especificar el método al registrar un mapa de clases:
BsonClassMap.RegisterClassMap<Employee>(classMap => { classMap.AutoMap(); classMap.MapMember(p => c.Age).SetShouldSerializeMethod( obj => ((Person) obj).Age != 0 ); });
Información Adicional
Para más información sobre el uso de clases C#, consulta POCOs.