¿Cómo guardar un JSON con EntityFramework Core?

Como guardar un JSON con EntityFramework Core

Considero que todos deberíamos saber guardar un JSON con EntityFramework Core ¿Porque? Porque he visto varios intentos de almacenar un JSON con EntityFramework y todos terminan cayendo en la obsesión por los primitivos.

¿Me podrías decir que WebhookData representa un JSON?
¿Me podrías decir que WebhookData representa un JSON?

En este artículo, les mostraré la implementación que yo haría para realizar esto. Les contaré que ventajas tiene esta implementación y porque es un gran error manejar un JSON como un string.

Un JSON no es un string

Bueno está bien, si es un string 😅. Pero entiéndanme cuando digo que cualquier JSON puede ser un string, pero no cualquier string puede ser un JSON.

JSON es un formato de datos basado en texto que sigue la sintaxis de objeto de JavaScript. Entonces si un JSON representa un objeto, no hay que tratarlo como un tipo primitivo como lo es string.

JsonDocument y JsonElement

JsonDocument es una clase que nos permite analizar un string como un documento de JSON. De esta forma, poder acceder a cada elemento del JSON.

Para esto último, existe la estructura JsonElement que nos permite obtener cada dato de todos los campos del JSON.

Les dejó un ejemplo de como utilizar JsonDocument y JsonElement.

Guardar un JSON con EntityFramework

Lo primero que debemos hacer es crear nuestra entidad con una propiedad que represente un JSON y debe ser del tipo JsonElement.

Propiedad JsonElement para guardar el JSON con EntityFramework
Clase Invoice. La propiedad WebhookData es un Json.

Lo segundo es configurar nuestra entidad en el DBContext. Acá hacemos uso del método HasConversion(). Este método nos permite configurar una propiedad para convertir su valor a otro cuando lo enviamos a la base de datos y cuando lo leemos.

Con el siguiente código ya estaría todo listo para guardar los JSON con EntityFramework y también para leerlos.

Configuraciones para guardar un JSON con EntityFramework
Configuramos nuestra entidad en el DbContext para mapear JSON con EntityFramework

Con este código se va a seguir guardando el JSON como si fuera un string (Varchar) en la base de datos, pero cuando lean estos datos, lo leerán como JSON.

Ventajas

Con esta implementación tendremos las siguientes ventajas:

  • Cualquier desarrollador va a saber que esa propiedad (WebhookData) representa un JSON y no cualquier string.
  • Evitamos caer en la Obsesión por los primitivos.
  • Estamos validando que en la base de datos siempre se guarden cadenas con formato de JSON y no cualquier Varchar.

Conclusión

Siempre que veo que almacenan JSON en la base de datos me da ese gustito a raro. Con esta implementación será mucho más fácil entender que se está haciendo con ese JSON, de donde viene y quedara más prolijo su dominio.

Para verlo mejor les dejo un repositorio de GitHub con esta implementación para que puedan clonarlo y probarlo ustedes mismos.