Atributos genéricos
Visión general
Los atributos genéricos permiten adjuntar metadatos clave-valor a entidades existentes sin modificar el esquema de la base de datos. Los datos se guardan en la tabla AtributoGenerico, con columnas para la entidad, el grupo de clave, la clave, el valor y la organización.
Mecanismo
La mayoría de las entidades que los usan derivan de EntidadConAtributos, que expone una propiedad AtributosGenericos (una AtributoGenericoColeccion) cargada de forma diferida. La colección se encarga de cargar y persistir los atributos.
Uso
Se trabaja con la colección mediante Obtener / Establecer y luego GuardarCambiosAsync. La conversión de tipos es automática (no hay que serializar a mano):
// entidad deriva de EntidadConAtributos
var atributos = entidad.AtributosGenericos;
var ultimoAcceso = atributos.Obtener<DateTime>("UltimoAcceso");
atributos.Establecer("UltimoAcceso", DateTime.UtcNow);
await atributos.GuardarCambiosAsync();
Otros miembros útiles: RecargarAsync(), IntentarObtenerEntidad(...) e IntentarEstablecer(...).
Soporte multi-organización
Tanto Obtener como Establecer aceptan un organizacionId. Cuando es 0, el valor es neutral respecto a la organización y aplica a todas; con un id concreto, el valor es específico de esa organización (ver Multiorganización).
atributos.Establecer("MiAjuste", "valor", organizacionId: organizacion.Id);
Colecciones tipadas y precarga
Para escenarios frecuentes existen colecciones tipadas, como UsuarioAtributoColeccion, que exponen los atributos de una entidad como propiedades fuertemente tipadas. Para operaciones masivas, IAtributoGenericoServicio permite precargar los atributos de muchas entidades a la vez, reduciendo consultas a la base de datos.
Buenas prácticas
Los atributos genéricos funcionan mejor para metadatos ligeros. Cuando necesites consultar por valor, almacenar contenido grande o modelar relaciones complejas, es preferible crear una entidad dedicada, ya que los atributos no están indexados ni permiten consultas estructuradas.