Presentamos a su atención DbTool, una utilidad de línea de comandos para exportar datos de bases de datos a varios formatos y la biblioteca de código abierto Korzh.DbUtils , cuyo uso puede simplificar enormemente la "siembra" inicial de la base de datos en su aplicación .NET (Core).
Con este kit de herramientas, puede:
- Guarde los datos de su base de datos local en archivos de cierto formato de texto (XML, JSON), que son fáciles de conectar al proyecto.
- Use los archivos guardados para completar la base de datos de la aplicación en su primer inicio.
A continuación le diré por qué es necesario todo esto, cómo instalar y configurar estas herramientas y describiré un escenario detallado para su uso.

La tarea inicial era crear un mecanismo de relleno de base de datos conveniente en aplicaciones .NET (Core). Debido a los detalles de nuestro tipo de actividad (desarrollo de componentes), a menudo tenemos que crear pequeñas aplicaciones de muestra que demuestren una u otra característica de nuestro producto. Dichos proyectos de demostración deberían funcionar con una determinada base de datos de prueba y, por lo tanto, es aconsejable crear y completar automáticamente esta base de datos al primer inicio de la aplicación.
Si el proyecto usa Entity Framework (Core) (y ocurre con mayor frecuencia), entonces no hay problemas para crear la base de datos. Simplemente llame a dbContext.Database.EnsureCreated
o dbContext.Database.Migrate
(si es importante mantener las migraciones).
Pero con el llenado de la base de datos, todo es un poco más complicado. Lo primero que viene a la mente es simplemente crear un script SQL con un montón de INSERT, ponerlo en el proyecto y ejecutarlo en el primer inicio. Esto funciona (y lo hicimos durante mucho tiempo), pero hay algunos problemas con este enfoque. En primer lugar, un problema de sintaxis SQL para un DBMS específico. Muy a menudo, el DBMS original es diferente del que realmente usa el usuario y nuestro script SQL puede no funcionar.
El segundo problema posible es la migración de la base de datos en sí. De vez en cuando, es necesario cambiar ligeramente la estructura de la base de datos (agregar un nuevo campo, eliminar o cambiar el nombre del anterior, agregar una nueva relación entre tablas, etc.). Un script SQL creado bajo la estructura anterior generalmente se vuelve irrelevante en este caso y su ejecución provoca un error. Mientras que la carga de datos de algún formato de terceros no tiene problemas. Los campos nuevos / modificados simplemente se omiten. Acuerde que, para fines de demostración, es mejor que el programa se inicie, aunque sin datos en algún campo nuevo, que no se inicie en absoluto.
Como resultado, llegamos a la siguiente solución:
- Los datos de la "copia maestra" de nuestra base de datos de demostración se registran en un archivo en cierto formato "independiente" (actualmente es XML o JSON). Los archivos resultantes (o un archivo de almacenamiento) se entregan con el proyecto. Esta tarea, de hecho, trata con DbTool.
- Se inserta un pequeño fragmento de código en nuestro programa que, utilizando las clases y funciones de la biblioteca Korzh.DbUtils, llena la base de datos con los datos de los archivos obtenidos en el primer paso.
Además del escenario anterior, DbTool puede usarse simplemente para exportar datos a otros formatos y transferir datos entre bases de datos. Entonces, por ejemplo, puede cargar datos de su base de datos a SQL Server y luego cargarlos en una base de datos similar en MySQL
Instalación
DbTool se implementa como una herramienta global de .NET Core, es decir se puede instalar fácilmente en cualquier sistema donde haya un SDK de .NET versión 2.1 o superior.
Para instalar la utilidad, solo necesita abrir la consola (Terminal / Símbolo del sistema) y ejecutar el siguiente comando:
dotnet tool install -g Korzh.DbTool
Para verificar después de la instalación, escriba dbtool
en la consola y verá ayuda con una lista de comandos disponibles.

Agregar conexión a la base de datos
Para comenzar a trabajar con DbTool necesita agregar una conexión de base de datos:
dbtool add {YourConnectionId} {DbType} {YourConnectionString}
Aquí:
- {YourConnectionId} es un identificador que desea asignar a esta conexión para que pueda acceder más tarde cuando ejecute otros comandos.
- DbType es el tipo de su DBMS. Al momento de escribir esto, DbTool (versión 1.1.7) soportaba bases de datos SQL Server (mssql) y MySQL (mysql).
- El último parámetro en este comando es la cadena de conexión. Lo mismo que ya usa en su proyecto .NET (Core).
Un ejemplo:

Después de eso, puede verificar todas sus conexiones escribiendo:
dbtool connections list
Exportación de datos
Ahora que hemos agregado la conexión, podemos exportar nuestra base de datos usando el comando de exportación:
dbtool export {ConnectionId} [--format=xml|json] [--output={path-to-folder}] [--zip={file-name}]
Cualquier opción mencionada anteriormente puede omitirse. Si no especifica el format
se utilizará JSON. Si omite la opción de output
, el resultado se colocará en un directorio con el formato ConnectionId_yyyy-MM-dd
en un formato desempaquetado.
Por ejemplo, el siguiente comando:
dbtool export MyDb01 --zip=MyDbData.zip
creará un archivo ZIP con el nombre MyDbData.zip en el directorio actual y lo llenará con archivos de datos en formato JSON (un archivo para cada tabla de base de datos).

Importación de datos
Puede importar los datos creados en el paso anterior a su base de datos. O a cualquier otra base con la misma estructura.
Importante: DbTool no crea tablas durante la operación de importación. Por lo tanto, la base de datos a la que se importan los datos ya debe existir y tener la misma estructura (o al menos similar) que la original.
El comando de importación en sí es el siguiente:
dbtool import {ConnectionId} [--input=path-to-file-or-folder] [--format=xml|json]
La opción --input
le dice a la utilidad dónde buscar datos importados. Si se especifica una ruta de carpeta, DbTool importará archivos .xml o .json en esta carpeta. Si se trata de un archivo ZIP, la utilidad primero descomprimirá este archivo y, a partir de ahí, eliminará los archivos de datos necesarios.
Como en el caso anterior, se puede omitir --format ya que DbTool puede reconocer el formato por extensiones de archivo.
Un ejemplo:
dbtool import MyDb01 --input=MyDbData.zip
Biblioteca Korzh.DbUtils
La utilidad DbTool en sí está construida sobre la base de la biblioteca de código abierto Korzh.DbUtils , que incluye varios paquetes con la implementación de algunas operaciones básicas de la base de datos.
Korzh.DbUtils
Define abstracciones básicas e interfaces como IDatasetExporter, IDatasetImporter, IDataPacker, IDbBridge
Korzh.DbUtils.Import
Contiene implementaciones de interfaces IDatasetImporter para formatos XML y JSON. Además, este paquete incluye la clase DbInitializer, que puede usar para completar datos en sus proyectos (más sobre esto a continuación).
Korzh.DbUtils.Export
Contiene implementaciones de IDatasetExporter para XML y JSON.
Korzh.DbUtils.SqlServer
Contiene la implementación de las interfaces de operaciones básicas de base de datos (IDbBridge, IDbReader, IDbSeeder) para MS SQL Server.
Korzh.DbUtils.MySQL
Contiene implementaciones de interfaces de bases de datos para MySQL.
Aquí puede encontrar la referencia completa en la biblioteca de la biblioteca Korzh.DbUtils .
Usando Korzh.DbUtils para llenar la base de datos con datos al inicio de la aplicación
Ahora, en realidad, consideraremos cómo usar DbTool y Korzh.DbUtils para implementar el script básico para llenar (inicializar) la base de datos en el primer lanzamiento de la aplicación.
Suponga que tiene una "copia maestra" de alguna base de datos que necesita "copiar" en la computadora del usuario cuando inicia la aplicación por primera vez.
Paso 1: exportar la copia maestra a JSON
Simplemente instale DbTool, como se describe anteriormente, agregue una conexión a la base de datos y ejecute el comando de exportación para guardar todos los datos de esta base de datos en una carpeta separada:
dotnet tool install -g Korzh.DbTool dbtool connections add MyMasterDb mssql "{ConnectionString}" dbtool export MyMasterDb
Paso 2: agregue archivos de datos a nuestro proyecto
Después del paso anterior, tenemos una nueva carpeta, de la forma MyMasterDb-aaaa-MM-dd, con un montón de archivos JSON (uno para cada tabla). Simplemente copie el contenido de esta carpeta en App_Data \ DbSeed de nuestro proyecto .NET (Core). Tenga en cuenta que para proyectos bajo .NET Framework también necesitará agregar manualmente estos archivos al proyecto.
Paso 3: código de inicialización de la base de datos
Aunque el proceso en sí (hasta algunos detalles) es aplicable para cualquier tipo de proyecto bajo .NET Core o .NET Framework (versión 4.6.1 o superior), por simplicidad de descripción, supongamos que estamos hablando de un proyecto ASP.NET Core que funciona con Base de datos de SQL Server y que esta base de datos se crea automáticamente utilizando Entity Framework Core.
Por lo tanto, para resolver el problema de llenar la base de datos con datos al principio, necesitamos:
1. Instale los paquetes de la biblioteca Korzh.DbUtils en el proyecto NuGet
En este caso, necesitamos 2 de ellos:
- Korzh.DbUtils.Import
- Korzh.DbUtils.SqlServer
2. Agregar código de inicialización
Aquí hay un ejemplo de dicho código que deberíamos agregar al final del método Startup.Configure:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { . . . . app.UseMvc(); using (var scope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope()) using (var context = scope.ServiceProvider.GetService<AppDbContext>()) { if (context.Database.EnsureCreated()) {
Para hacer que todo sea bastante hermoso, o si necesita realizar una inicialización adicional en el primer inicio (por ejemplo, agregar varias cuentas de usuario y / o roles de usuario), entonces es mejor diseñar todo este código como un método de extensión separado (llamémosle EnsureDbInitialized
) para la interfaz IApplicationBuilder
.
Un ejemplo de tal implementación se puede encontrar en GitHub en el proyecto de demostración para la biblioteca EasyQuery .
En este caso, solo necesita agregar una llamada al final de su Inicio. Método de configuración:
public void Configure ( IApplicationBuilder, IHostingEnvironment) { . . . . app.UseMvc ();
Planes futuros
Aunque la biblioteca y la utilidad se escribieron en un escenario muy específico, intentamos hacer todo lo más flexible y extensible posible, por lo que habilitar la funcionalidad adicional no sería un problema.
De las posibles mejoras, vemos lo siguiente:
Soporte para otras bases de datos (PostgreSQL, Oracle, SQLite, MariaDB)
Nuevos formatos a los que puede exportar datos (CSV, Excel, HTML)
La operación de copiar directamente datos de la base de datos a la base de datos (ahora puede implementarlos mediante un par de llamadas consecutivas a los comandos de exportación / importación)
Operaciones completas de copia de seguridad / restauración con preservación completa de la estructura de la base de datos y su creación desde cero durante la recuperación.
Estaremos encantados de escuchar cualquier sugerencia o comentario y estamos muy agradecidos por las nuevas estrellas para el repositorio de la biblioteca de GitHub :)
Gracias por su atencion!