Implementación web de ASP.NET mediante Visual Studio: implementación de una actualización de base de datos

por Tom Dykstra

Descarga del proyecto de inicio

Esta serie de tutoriales muestra cómo implementar (publicar) una aplicación web ASP.NET en Azure App Service Web Apps o en un proveedor de hospedaje de terceros mediante Visual Studio 2012 o Visual Studio 2010. Para obtener información sobre la serie de tutoriales, consulte el primer tutorial de la serie.

Información general

En este tutorial, realizará un cambio de base de datos (con los cambios de código relacionados) probará los cambios en Visual Studio y, a continuación, implementará la actualización en los entornos de prueba, preproducción y producción.

En primer lugar, el tutorial muestra cómo actualizar una base de datos administrada por Migraciones de Code First y, después, cómo actualizar una base de datos mediante el proveedor dbDacFx.

Aviso: Si recibe un mensaje de error o tiene un problema mientras lee el tutorial, asegúrese de visitar la página de solución de problemas.

Implementación de una actualización de base de datos mediante migraciones de Code First

En esta sección, agregará una columna de fecha de nacimiento a la clase base Person para las entidades Student y Instructor. A continuación, actualizará la página que muestra los datos del instructor para que muestre la nueva columna. Por último, implementará los cambios en pruebas, preproducción y producción.

Agregar una columna a una tabla en la base de datos de la aplicación

  1. En el proyecto ContosoUniversity.DAL, abra Person.cs y agregue la siguiente propiedad al final de la clase Person (debe haber dos llaves de cierre siguientes):

    [DisplayFormat(DataFormatString = "{0:d}", ApplyFormatInEditMode = true)]
    [Display(Name = "Birth Date")]
    public DateTime? BirthDate { get; set; }
    

    Luego, actualice el método Seed para que proporcione un valor para la nueva columna. Abra Migrations\Configuration.cs y reemplace el bloque de código que comienza por var instructors = new List<Instructor> por el siguiente bloque de código que incluye información de la fecha de nacimiento:

    var instructors = new List<Instructor>
    {
        new Instructor { FirstMidName = "Kim",     LastName = "Abercrombie", HireDate = DateTime.Parse("1995-03-11"), BirthDate = DateTime.Parse("1918-08-12"), OfficeAssignment = new OfficeAssignment { Location = "Smith 17" } },
        new Instructor { FirstMidName = "Fadi",    LastName = "Fakhouri",    HireDate = DateTime.Parse("2002-07-06"), BirthDate = DateTime.Parse("1960-03-15"), OfficeAssignment = new OfficeAssignment { Location = "Gowan 27" } },
        new Instructor { FirstMidName = "Roger",   LastName = "Harui",       HireDate = DateTime.Parse("1998-07-01"), BirthDate = DateTime.Parse("1970-01-11"), OfficeAssignment = new OfficeAssignment { Location = "Thompson 304" } },
        new Instructor { FirstMidName = "Candace", LastName = "Kapoor",      HireDate = DateTime.Parse("2001-01-15"), BirthDate = DateTime.Parse("1975-04-11") },
        new Instructor { FirstMidName = "Roger",   LastName = "Zheng",       HireDate = DateTime.Parse("2004-02-12"), BirthDate = DateTime.Parse("1957-10-12") }
    };
    
  2. Compile la solución y, a continuación, abra la ventana Consola del Administrador de paquetes. Asegúrese de que ContosoUniversity.DAL todavía está seleccionado como proyecto Predeterminado.

  3. En la ventana Consola de Administrador de paquetes, seleccione ContosoUniversity.DAL como proyecto predeterminado y escriba el siguiente comando:

    add-migration AddBirthDate
    

    Cuando este comando finalice, Visual Studio abrirá el archivo de clase que define la nueva clase DbMigration. En el método Up puede ver el código que crea la nueva columna. El método Up crea la columna al implementar el cambio y el método Down elimina la columna al revertir el cambio.

    AddBirthDate_migration_code

  4. Compile la solución y escriba el siguiente comando en la ventana Consola de Administrador de paquetes (asegúrese de que el proyecto ContosoUniversity.DAL todavía está seleccionado):

    update-database
    

    Entity Framework ejecuta el método Up y, a continuación, ejecuta el método Seed.

Mostrar la nueva columna en la página Instructors

  1. En el proyecto ContosoUniversity, abra Instructors.aspx y agregue un nuevo campo de plantilla para mostrar la fecha de nacimiento. Agréguelo entre los de la fecha de contratación y la asignación de oficina:

    <asp:TemplateField HeaderText="Hire Date" SortExpression="HireDate">
        <ItemTemplate>
            <asp:Label ID="InstructorHireDateLabel" runat="server" Text='<%# Eval("HireDate", "{0:d}") %>'></asp:Label>
        </ItemTemplate>
        <EditItemTemplate>
            <asp:TextBox ID="InstructorHireDateTextBox" runat="server" Text='<%# Bind("HireDate", "{0:d}") %>' Width="7em"></asp:TextBox>
        </EditItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Birth Date" SortExpression="BirthDate">
        <ItemTemplate>
            <asp:Label ID="InstructorBirthDateLabel" runat="server" Text='<%# Eval("BirthDate", "{0:d}") %>'></asp:Label>
        </ItemTemplate>
        <EditItemTemplate>
            <asp:TextBox ID="InstructorBirthDateTextBox" runat="server" Text='<%# Bind("BirthDate", "{0:d}") %>'
                Width="7em"></asp:TextBox>
        </EditItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Office Assignment" SortExpression="OfficeAssignment.Location">
        <ItemTemplate>
            <asp:Label ID="InstructorOfficeLabel" runat="server" Text='<%# Eval("OfficeAssignment.Location") %>'></asp:Label>
        </ItemTemplate>
        <EditItemTemplate>
            <asp:TextBox ID="InstructorOfficeTextBox" runat="server"
                Text='<%# Eval("OfficeAssignment.Location") %>' Width="7em"
                OnInit="InstructorOfficeTextBox_Init"></asp:TextBox>
        </EditItemTemplate>
    </asp:TemplateField>
    

    (Si la sangría de código no está sincronizada, puede presionar CTRL-K y, a continuación, CTRL-D para volver a formatear automáticamente el archivo).

  2. Ejecute la aplicación y haga clic en el vínculo Instructors.

    Cuando se cargue la página, verá que tiene el nuevo campo de fecha de nacimiento.

    Screenshot of the Instructors page showing their Name, Hire Date, Birth Date, and Office Assignment.

  3. Cierre el explorador.

Implementación de la actualización de la base de datos

  1. En el Explorador de soluciones, seleccione el proyecto ContosoUniversity.

  2. En la barra de herramientas Publicar en la web con un solo clic, haga clic en Prueba y, a continuación, en Publicar web. (Si la barra de herramientas está deshabilitada, seleccione el proyecto ContosoUniversity en Explorador de soluciones).

    Visual Studio implementa la aplicación actualizada y el explorador se abre en la página principal.

  3. Ejecute la página Instructors para comprobar que la actualización se implementó correctamente.

    Cuando la aplicación intenta acceder a la base de datos de esta página, Code First actualiza el esquema de la base de datos y ejecuta el método Seed. Cuando se muestre la página, verá la columna Fecha de nacimiento esperada con fechas en ella.

  4. En la barra de herramientas Publicar en la web con un solo clic, haga clic en el perfil de publicación de Preproducción y, a continuación, en Publicar web.

  5. Ejecute la página Instructors en el entorno de preproducción para comprobar que la actualización se implementó correctamente.

  6. En la barra de herramientas Publicar en la web con un solo clic, haga clic en el perfil de publicación de Producción y, a continuación, haga clic en Publicar web.

  7. Ejecute la página Instructors en producción para comprobar que la actualización se implementó correctamente.

    En el caso de una actualización real de la aplicación de producción que incluya un cambio de base de datos, normalmente también se desconectaría la aplicación durante la implementación mediante app_offline.htm, como se vio en el tutorial anterior.

Implementación de una actualización de base de datos mediante el proveedor dbDacFx

En esta sección, agregará una columna Comentarios a la tabla Usuario de la base de datos de pertenencia y creará una página que le permita mostrar y editar comentarios para cada usuario. Luego, implementará los cambios en pruebas, preproducción y producción.

Agregar una columna a una tabla en la base de datos de pertenencia

  1. En Visual Studio, abra el Explorador de objetos de SQL Server.

  2. Expanda (localdb)\v11.0, expanda Bases de datos, expanda aspnet-ContosoUniversity (no aspnet-ContosoUniversity-Prod) y, a continuación, expanda Tablas.

    Si no ve (localdb)\v11.0 en el nodo SQL Server, haga clic con el botón derecho en el nodo SQL Server y haga clic en Agregar SQL Server. En el cuadro de diálogo Conectar al servidor, escriba (localdb)\v11.0 como nombre del servidor y, a continuación, haga clic en Conectar.

    Si no ve aspnet-ContosoUniversity, ejecute el proyecto e inicie sesión con las credenciales de administrador (la contraseña es devpwd) y, a continuación, actualice la ventana de Explorador de objetos de SQL Server.

  3. Haga clic con el botón derecho en la tabla Usuarios y, a continuación, haga clic en Diseñador de vistas.

    SSOX View Designer

  4. En el diseñador, agregue una columna Comentarios y conceda el valor nvarchar(128), admita valores NULL y, a continuación, haga clic en Actualizar.

    Adding Comments column

  5. En el cuadro Actualizaciones de base de datos de versión preliminar, haga clic en Actualizar base de datos.

    Preview Database Updates

Crear una página para mostrar y editar la nueva columna

  1. En Explorador de soluciones, haga clic con el botón derecho en la carpeta Cuenta del proyecto ContosoUniversity, haga clic en Agregar y, a continuación, haga clic en Nuevo elemento.

  2. Cree un Formulario web con la página maestra y asígnele el nombre UserInfo.aspx. Acepte el archivo Site.Master predeterminado como página maestra.

  3. Copie el marcado siguiente en el elemento MainContentContent (el último de los 3 elementos Content):

    <h2>User Information</h2>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:DefaultConnection %>" 
            SelectCommand="SELECT UserId, UserName, Comments FROM [Users]" 
            UpdateCommand="UPDATE [Users] SET [UserName] = @UserName, [Comments] = @Comments WHERE [UserId] = @UserId">
            <DeleteParameters>
                <asp:Parameter Name="UserId" Type="Object" />
            </DeleteParameters>
            <UpdateParameters>
                <asp:Parameter Name="UserId" Type="Object" />
                <asp:Parameter Name="UserName" Type="String" />
                <asp:Parameter Name="Comments" Type="String" />
            </UpdateParameters>
        </asp:SqlDataSource>
    
        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="UserId" DataSourceID="SqlDataSource1">
            <Columns>
                <asp:CommandField ShowEditButton="True" />
                <asp:BoundField DataField="UserName" HeaderText="UserName" SortExpression="UserName" />
                <asp:BoundField DataField="Comments" HeaderText="Comments" SortExpression="Comments" />
            </Columns>
        </asp:GridView>
    
  4. Haga clic con el botón derecho en la página UserInfo.aspx y en Ver en el Explorador.

  5. Inicie sesión con las credenciales del usuario administrador (la contraseña es devpwd) y agregue algunos comentarios a un usuario para comprobar que la página funciona correctamente.

    Screenshot showing the UserInfo page displaying the UserName test and the Comment Tom's test account.

  6. Cierre el explorador.

Implementación de la actualización de la base de datos

Para implementar mediante el proveedor dbDacFx, solo tiene que seleccionar la opción Actualizar base de datos en el perfil de publicación. Sin embargo, para la implementación inicial cuando usó esta opción, también configuró algunos scripts SQL adicionales para ejecutar: estos siguen en el perfil y tendrá que impedir que se ejecuten de nuevo.

  1. Para abrir el Asistente para publicación web, haga clic con el botón derecho en el proyecto Contoso University y en Publicar.

  2. Seleccione el perfil Prueba.

  3. Haga clic en la pestaña Configuración .

  4. En DefaultConnection, seleccione Actualizar base de datos.

  5. Deshabilite los scripts adicionales que configuró para ejecutarse en la implementación inicial:

    1. Haga clic en Configurar actualizaciones de base de datos.
    2. En el cuadro de diálogo Configurar Actualizaciones de base de datos, desmarque las casillas situadas junto a Grant.sql y aspnet-data-dev.sql.
    3. Haga clic en Cerrar.
  6. Haga clic en la pestaña Vista previa .

  7. En Bases de datos y a la derecha de DefaultConnection, haga clic en el vínculo Vista previa de la base de datos.

    Database Preview

    La ventana de vista previa muestra el script que se ejecutará en la base de datos de destino para que ese esquema de base de datos coincida con el esquema de la base de datos de origen. El script incluye un comando ALTER TABLE que agrega la nueva columna.

  8. Cierre el cuadro de diálogo Vista previa de la base de datos y, a continuación, haga clic en Publicar.

    Visual Studio implementa la aplicación actualizada y el explorador se abre en la página principal.

  9. Ejecute la página UserInfo (agregue cuenta o UserInfo.aspx a la dirección URL de la página principal) para comprobar que la actualización se implementó correctamente. Para iniciar sesión, escriba admin y devpwd.

    Los datos de las tablas no se implementan de forma predeterminada y no ha configurado un script de implementación de datos para su ejecución, por lo que no encontrará el comentario que agregó en desarrollo. Puede agregar un nuevo comentario ahora en preproducción para comprobar que el cambio se implementó en la base de datos y que la página funciona correctamente.

  10. Siga el mismo procedimiento para realizar la implementación en preproducción y producción.

    No olvide deshabilitar los scripts adicionales. La única diferencia en comparación con el perfil de prueba es que solo deshabilitará un script en los perfiles de preproducción y producción porque se configuraron para ejecutar solo aspnet-prod-data.sql.

    Las credenciales para preproducción y producción son admin y prodpwd.

    En el caso de una actualización real de la aplicación de producción que incluyera un cambio de base de datos, normalmente también se desconectaría de internet la aplicación durante la implementación mediante la carga de app_offline.htm antes de publicarla y eliminarla después, como vio en el tutorial anterior.

Resumen

Ahora ha implementado una actualización de aplicación que incluía un cambio de base de datos mediante Migraciones de Code First y el proveedor dbDacFx.

Screenshot showing the Instructors page displaying their Name, Hire Date, Birth Date, and Office Assignment.

Screenshot of the UserInfo page showing the UserName test and the Comment Tom's test account.

En el siguiente tutorial se muestra cómo ejecutar implementaciones mediante la línea de comandos.