Docs Menu
Docs Home
/ /

Mapeo de clases

En esta guía, aprenderá a personalizar la forma en que el controlador MongoDB .NET/C# asigna documentos BSON a y desde clases de C#. Lea esta página para obtener más información sobre el comportamiento predeterminado de asignación de clases o si necesita personalizar la forma en que el controlador serializa o deserializa sus datos.

También puede usar atributos POCO para configurar el comportamiento de serialización. Para obtener más información, consulte Guíade POCO.

Cuando se utiliza una clase, en lugar de una BsonDocumentPara representar datos en una colección de MongoDB, el controlador .NET/C# crea automáticamente un mapa de clases que utiliza para serializar o deserializar los datos. Esta asignación se realiza haciendo coincidir el nombre del campo en el documento con el nombre de la propiedad en la clase.

Importante

Coincida el tipo de la propiedad de su clase con el tipo del campo del documento. El controlador .NET/C# instancia un serializador según el tipo de la propiedad de su clase. Si los tipos no coinciden al intentar deserializar los datos, el serializador genera una excepción.

Puede omitir la funcionalidad de mapeo automático de clases del controlador y definir manualmente el mapa de clases utilizando el método RegisterClassMap().

El siguiente ejemplo define una clase 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 clase 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 clase

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 clase, permitiendo que el controlador asigne automáticamente las propiedades restantes. Para ello, registre un mapa de clase y llame al método AutoMap() antes de especificar manualmente las 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");
});

Puede personalizar cómo el controlador serializa y deserializa documentos a nivel de clase aplicando atributos a la clase o llamando métodos mientras registra un mapa de clase.

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 mapa de clase para evitar que se serialice la propiedad Age:

BsonClassMap.RegisterClassMap<Person>(classMap =>
{
classMap.AutoMap();
classMap.UnmapMember(p => p.Age);
});

Tip

Para obtener información sobre cómo configurar este comportamiento mediante un atributo de campo, consulte la sección Omitir campos de la guía de POCO.

Cuando un documento BSON se deserializa a una clase de C#, el controlador .NET/C# examina el nombre de cada campo del documento e intenta encontrar un nombre de propiedad coincidente en la clase. De forma predeterminada, si un campo del documento no coincide con la clase, el controlador genera 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.

[BsonIgnoreExtraElements]
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 adicional al registrar un mapa de clase:

BsonClassMap.RegisterClassMap<Person>(classMap =>
{
classMap.AutoMap();
classMap.SetIgnoreExtraElements(true);
});

De forma predeterminada, el controlador asigna cualquier propiedad pública denominada Id, id o _id al campo BSON _id. Para seleccionar explícitamente la propiedad que se asignará al campo _id, utilice el método de asignación 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);
});

Si usa cadenas para representar los ID de sus documentos, puede usar el método de mapa de clase IdMemberMap.SetSerializer() para serializar estos valores en instancias ObjectId en MongoDB. De esta manera, puede personalizar la representación de sus valores de ID en su aplicación, siguiendo las prácticas recomendadas de MongoDB para la gestión de ID en la base de datos.

El siguiente ejemplo indica al controlador que serialice los valores de ID de cadena como valores 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.

Si su aplicación utiliza GUID como identificadores únicos en sus documentos, puede registrar un mapa de clases para especificar cómo se serializan los valores Guid. De forma predeterminada, el controlador utiliza el tipo GuidGenerator para generar un valor único para la propiedad ID. Debe especificar la representación GUID inicializando un GuidSerializer.

El siguiente código especifica la representación GUID Standard al registrar el mapa de clase:

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.

De forma predeterminada, el controlador .NET/C# solo puede asignar automáticamente una clase si esta tiene un constructor sin argumentos. Si desea que el controlador utilice un constructor que acepte uno o más argumentos, puede agregarle el atributo BsonConstructor. En este caso, el controlador examina los tipos para determinar cómo asignar los argumentos del constructor a las propiedades o campos de la clase.

Cuando el controlador 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 a la propiedad Age.

public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public List<string> Hobbies {get; set;}
[BsonConstructor]
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 a utilizar al registrar su mapa de clase:

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

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.

Puedes diseñar tu clase de C# para que almacene cualquier elemento adicional en tu documento que no tenga propiedades de clase coincidentes. Para ello, tu clase debe tener una propiedad de tipo BsonDocument que contenga los elementos adicionales.

El siguiente código utiliza el atributo BsonExtraElements con la propiedad ExtraElements para indicarle al controlador que almacene elementos adicionales:

public class Person
{
public string Name { get; set;
public int Age { get; set; }
public List<string> Hobbies {get; set;}
[BsonExtraElements]
public BsonDocument ExtraElements {get; set;}
}

También puedes admitir elementos adicionales 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 en BSON, es posible que los elementos adicionales no estén en el mismo orden en que estaban en el documento original.

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 solo serializa la propiedad Age si su valor no es igual a 0. El controlador 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
);
});

Para obtener más información sobre el uso de clases C#, consulte POCO.

  • Mapa de clases de Bson

  • RegistrarMapaDeClase

  • AutoMap

Volver

Serialización

En esta página