none
Code First - Procedimiento Almacenado RRS feed

  • 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.

    jueves, 18 de junio de 2020 12:08

Respuestas

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

    Custom Migrations Operations

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 18 de junio de 2020 12:59
  • 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.

    jueves, 18 de junio de 2020 13:31
  • 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

    jueves, 18 de junio de 2020 13:39
  • 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
    jueves, 18 de junio de 2020 19:40
  • 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
    jueves, 18 de junio de 2020 20:59
  • 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
    jueves, 18 de junio de 2020 22:59
  • Hola,

     

    gracias por confirmar que encontraste una respuesta a tu pregunta.

     

    Saludos cordiales

     

    Gabriel Castro

    jueves, 16 de julio de 2020 1:51