none
¿Como eliminar tablas desde EF Code First (desde la consola del administrador de paquetes)? RRS feed

  • Pregunta

  • Hola ...

    Desarrollo una aplicacion WebApi y utilizo Entity Framework Code First...

    Como puedo hacer para eliminar tablas desde  mi codigo ??


    EFRAIN MEJIAS C VALENCIA - VENEZUELA


    miércoles, 13 de noviembre de 2019 14:08

Respuestas

  • Si es un EF moderno, puedes usar

    dbcontext.Database.ExecuteSqlCommand("DROP TABLE nombreDeTabla")

    EDITADO: Nótese que para que esto funcione la conexión tiene que tener suficientes privilegios para eliminar tablas, lo cual contradice el principio de mínimos privilegios que bajo circunstancias ordinarias te llevaría a usar únicamente desde tu WebApi permisos de lectura (y en algunas ocasiones de escritura) pero no de ejecución de DDL. Una solución para esto es poner el drop table dentro de un procedimiento almacenado que esté configurado con "WITH EXECUTE AS..." y darle permisos para ejecutar el procedimiento a la cuenta utilizada por esa conexión. Y dentro del procedimiento meter validaciones para que no acepte borrar otras tablas que no esté previsto borrar mediante este mecanismo.

    miércoles, 13 de noviembre de 2019 16:50

Todas las respuestas

  • Si es un EF moderno, puedes usar

    dbcontext.Database.ExecuteSqlCommand("DROP TABLE nombreDeTabla")

    EDITADO: Nótese que para que esto funcione la conexión tiene que tener suficientes privilegios para eliminar tablas, lo cual contradice el principio de mínimos privilegios que bajo circunstancias ordinarias te llevaría a usar únicamente desde tu WebApi permisos de lectura (y en algunas ocasiones de escritura) pero no de ejecución de DDL. Una solución para esto es poner el drop table dentro de un procedimiento almacenado que esté configurado con "WITH EXECUTE AS..." y darle permisos para ejecutar el procedimiento a la cuenta utilizada por esa conexión. Y dentro del procedimiento meter validaciones para que no acepte borrar otras tablas que no esté previsto borrar mediante este mecanismo.

    miércoles, 13 de noviembre de 2019 16:50
  • Hola Alberto Poblacion.

    Pense si se puede hacer desde la consola del proyecto ' como si fuera un comando

    otra cosa donde debo escribir exactamente el codigo que propones ??


    EFRAIN MEJIAS C VALENCIA - VENEZUELA

    miércoles, 13 de noviembre de 2019 18:30
  • donde debo escribir exactamente el codigo que propones ??

    En el sitio del programa donde quieras que se borren las tablas. Por ejemplo, si tienes un botón titulado "borrar tablas", pues entonces lo pondrías en el evento Click de ese botón.

    Recuerda que tienes que cambiar la palabra "dbcontext" por el nombre que realmente estés usando para tu contexto de datos cuando usas Entity Framework en tu programa. Por ejemplo si haces

    using (var micontexto=new MiDbContext()) { aquí tu código de EF }

    pues entonces donde dice "aqui tu código de EF" es donde meterías micontexto.Database.ExecuteSqlCommand(...)

    EDITADO: Volviendo a la pregunta inicial, dices "eliminar tablas desde mi código" y no "eliminar tablas de micodigo". Si la preposición es "desde" se interpreta que en tiempo de ejecución quieres enviar sobre la marcha un comando al servidor para que se borren tablas que ya existen ahí. Eso es lo que se hace con la instrucción que te indico. Si quieres un "de", se interpreta que en tiempo de desarrollo (no de ejecución) quieres eliminar las partes del programa que acceden a dichas tablas. Esto es algo completamente distinto, y es lo que harías "desde consola" si fuera un EF database-first. De ahí la sorpresa de tu pregunta de "si se puede hacer desde la consola del proyecto", que resulta contradictorio con la pregunta inicial de "eliminar desde mi código".



    miércoles, 13 de noviembre de 2019 18:49
  • Hola Albert Poblacion

    En realidad Nesecito eliminarlas desde la consola del administrador de paquetes ... Disculpa ya ediito mi post


    EFRAIN MEJIAS C VALENCIA - VENEZUELA

    miércoles, 13 de noviembre de 2019 19:14
  • Es un sitio un poco raro. La consola del administrador de paquetes admite comandos para administrar los paquetes NuGet tales como "Install-Package ...". Son las mismas operaciones que normalmente realizarías gráficamente desde la ventanita de "Administrar paquetes NuGet". No tiene nada que ver con las tablas de la base de datos. Salvo que dispongas del plugin de SQL Server para Powershell y se puedan ejecutar los comandos de SQL por esa vía, que no sé si funciona desde dentro de Visual Studio, pero incluso aunque funcione sigue siendo algo poco propicio para hacerlo desde el administrador de paquetes de Visual Studio.

    Desde el sistema puedes abrir una ventana de comandos (CMD) y desde ahí abres el SQLCMD, y ahí puedes teclear el comando DROP TABLE. También puedes hacerlo desde SQL Server Management Studio usando la ventana "New Query".

    Si lo quieres desde Visual Studio, puedes usar Tools -> Connect to Database para abrir una conexión a tu servidor de base de datos. La conexión aparecerá en el Server Explorer. Entonces haces click derecho sobre la conexión y seleccionas "New Query". Eso te abre una ventana de comandos SQL en Visual Studio, y ahí puedes teclear y ejecutar el comando "DROP TABLE...". Pero no es necesario teclearlo, desde la propia conexión puedes expandir "Tables", ahí encuentras tu tabla, y haces click-derecho y "Delete".


    miércoles, 13 de noviembre de 2019 20:20