Principales respuestas
Code First - Procedimiento Almacenado

Pregunta
-
Buenas,
Estoy trabajando con EF Core 3.1 bajo el enfoque Code First, hasta el momento no he requerido de procedimientos almacenados.
He creado un procedimiento en la Base de Datos, luego intento crear la migración pero ésta se crea vacía, es decir, no está detectando al procedimiento almacenado.
¿Qué configuración debo realizar al contexto para que me pueda detectar los procedimientos?
Saludos.
Respuestas
-
hola
No me referia a usar archivos resx sino a embeber el archivo directo en el proyecto cambiando la propiedad
Embed and Read Resource Files in Windows Form Application
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina- Marcado como respuesta eduar2083 jueves, 18 de junio de 2020 23:05
Todas las respuestas
-
hola
>>luego intento crear la migración pero ésta se crea vacía, es decir, no está detectando al procedimiento almacenado.
No creo que migration detecte procedure, esto es algo que tu debes agregar programandolo, un ORM de por si no necesita para nada los procedure por eso entiendo que es correcto que no los detecte/utilice
A donde apunto es que no se migra automaticamente el procedure, sino que es algo que debes codificar tu mismo para agregarlo
Create Stored Procedures using Entity Framework Code First?
Code First Migrations and Stored Procedures
agregas un migration que ejecute el sql del CREATE PROCEDURE
Podrias ver de usar
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina -
Hola Leandro,
Entiendo que debo codificar manualmente la migración tanto su método Up como el Down y escribir el contenido del procedimiento como un String. Esto resulta bastante tedioso y propenso a errores si el procedimiento es de regular tamaño. Imagino que lo que sí podría hacer es crear todo el procedimiento en un archivo independiente con extensión .sql y escribir ahí el código del procedimiento y leerlo desde el método Up.
-
hola
>>crear todo el procedimiento en un archivo independiente con extensión .sql y escribir ahí el código del procedimiento y leerlo desde el método Up.
si esa es una buena idea
podrias embeber el archivo como resource asi tomas el texto desde el assembly en lugar de tener que definir una ruta fisica al archivo que tendras el texto del procedure
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina -
He trabajado con archivos resx pero sólo para trabajar con cadenas, no he trabajado con archivos.
He creado mi archivo de recursos:
Al cual le he agregado el archivo .sql:
Cómo hago para leer el contenido del archivo embedido en el resx?
No encuentro mucha info al respecto, sólo encuentro cómo leer String.
Muchas gracias.
- Editado eduar2083 jueves, 18 de junio de 2020 19:42
-
hola
No me referia a usar archivos resx sino a embeber el archivo directo en el proyecto cambiando la propiedad
Embed and Read Resource Files in Windows Form Application
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina- Marcado como respuesta eduar2083 jueves, 18 de junio de 2020 23:05
-
Bien, creo que confundí las cosas:
He hecho lo siguiente:
- He creado un método de extensión de AppDomain para obtener e Assembly (dado que el archivo se encuentra en un proyecto diferente al de ejecución)
public static class AppDomainExtensions { public static Assembly GetAssemblyByName(this AppDomain domain, string assemblyName) { return domain.GetAssemblies().FirstOrDefault(a => a.GetName().Name == assemblyName); } }
- También he creado un método de extensión de Assembly
public static class AssemblyExtensions { public static string GetManifestResourceName(this Assembly assembly, string fileName) { string name = assembly.GetManifestResourceNames().SingleOrDefault(n => n.EndsWith(fileName, StringComparison.InvariantCultureIgnoreCase)); if (string.IsNullOrEmpty(name)) { throw new FileNotFoundException($"Embedded file '{fileName}' could not be found in assembly '{assembly.FullName}'.", fileName); } return name; } public static async Task<string> ReadFileAsync(this Assembly assembly, string fileName) { var resourceName = assembly.GetManifestResourceName(fileName); using (var stream = assembly.GetManifestResourceStream(resourceName)) { using (var reader = new StreamReader(stream)) { return await reader.ReadToEndAsync(); } } } }
Y la migración quedó finalmente así:
namespace Infraestructure.Data.MainModule.Migrations { public partial class USP_ESTADISTICAS_CREATE : Migration { protected override void Up(MigrationBuilder migrationBuilder) { var assembly = AppDomain.CurrentDomain.GetAssemblyByName("Infraestructure.CrossCutting.Utilities"); var sql = assembly.ReadFileAsync("USP_ESTADISTICAS.sql"); migrationBuilder.Sql(sql.Result); } protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.Sql("DROP PROCEDURE RHE.USP_ESTADISTICAS"); } } }
Modifiqué la propiedad del archivo sql
Acción de compilación => Recurso Incrustado
Y va muy bien. Muchas gracias Leandro por tu gran apoyo.
Saludos.
- Editado eduar2083 jueves, 18 de junio de 2020 23:04
-