ASP.NET webimplementatie met Visual Studio: Een database-update implementeren

door Tom Dykstra

Startersproject downloaden

Deze reeks zelfstudies laat zien hoe u een ASP.NET-webtoepassing implementeert (publiceert) naar Azure App Service Web Apps of naar een externe hostingprovider met behulp van Visual Studio 2012 of Visual Studio 2010. Zie de eerste zelfstudie in de reeks voor meer informatie over de reeks.

Overzicht

In deze zelfstudie maakt u een databasewijziging en gerelateerde codewijzigingen, test u de wijzigingen in Visual Studio en implementeert u vervolgens de update in de test-, faserings- en productieomgevingen.

In de zelfstudie ziet u eerst hoe u een database bijwerkt die wordt beheerd door Code First Migrations. Later ziet u hoe u een database bijwerkt met behulp van de dbDacFx-provider.

Herinnering: Als u een foutbericht krijgt of iets niet werkt terwijl u de zelfstudie doorloopt, controleert u de pagina voor probleemoplossing.

Een database-update implementeren met code first migrations

In deze sectie voegt u een kolom met geboortedatum toe aan de Person basisklasse voor de Student en Instructor entiteiten. Vervolgens werkt u de pagina bij waarin docentgegevens worden weergegeven, zodat de nieuwe kolom wordt weergegeven. Ten slotte implementeert u de wijzigingen om te testen, faseren en productie.

Een kolom toevoegen aan een tabel in de toepassingsdatabase

  1. Open het bestand Person.cs in het project ContosoUniversity.DAL en voeg de volgende eigenschap toe aan het einde van de Person klassedefinitie (er zouden twee accolade-sluitingen erachter moeten staan).

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

    Werk vervolgens de Seed methode bij zodat deze een waarde biedt voor de nieuwe kolom. Open Migrations\Configuration.cs en vervang het codeblok dat begint var instructors = new List<Instructor> met het volgende codeblok met informatie over geboortedatum:

    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. Bouw de oplossing en open vervolgens het venster Package Manager Console . Zorg ervoor dat ContosoUniversity.DAL nog steeds is geselecteerd als het standaardproject.

  3. Selecteer ContosoUniversity.DAL in het venster Package Manager Console als het standaardproject en voer vervolgens de volgende opdracht in:

    add-migration AddBirthDate
    

    Wanneer deze opdracht is voltooid, opent Visual Studio het klassebestand dat de nieuwe DbMigration klasse definieert. In de Up methode ziet u de code waarmee de nieuwe kolom wordt gemaakt. De Up methode maakt de kolom wanneer u de wijziging implementeert en de Down methode verwijdert de kolom wanneer u de wijziging terugrolt.

    AddBirthDate_migration_code

  4. Bouw de oplossing en voer vervolgens de volgende opdracht in het venster Package Manager Console in (zorg ervoor dat het project ContosoUniversity.DAL nog steeds is geselecteerd):

    update-database
    

    Entity Framework voert de Up methode uit en voert vervolgens de Seed methode uit.

De nieuwe kolom weergeven op de pagina Instructeurs

  1. Open in het project ContosoUniversity Instructors.aspx en voeg een nieuw sjabloonveld toe om de geboortedatum weer te geven. Voeg het toe tussen de indiensttredingsdatum en de toewijzing van kantoor.

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

    (Als de code-inspringing niet meer is gesynchroniseerd, kunt u op CTRL-K drukken en vervolgens CTRL-D om het bestand automatisch te formatteren.)

  2. Voer de toepassing uit en klik op de koppeling Instructeurs .

    Wanneer de pagina wordt geladen, ziet u dat deze het nieuwe geboortedatumveld bevat.

    Schermopname van de pagina Instructeurs met naam, indiensttredingsdatum, geboortedatum en kantoorindeling.

  3. Sluit de browser.

De database-update implementeren

  1. Selecteer in Solution Explorer het ContosoUniversity-project.

  2. Klik in de Publiceren op Web met één klik werkbalk op het publicatieprofiel Test en klik vervolgens op Publiceer Web. (Als de werkbalk is uitgeschakeld, selecteert u het Project ContosoUniversity in Solution Explorer.)

    Visual Studio implementeert de bijgewerkte toepassing en de browser wordt geopend op de startpagina.

  3. Voer de pagina Instructeurs uit om te controleren of de update is geïmplementeerd.

    Wanneer de toepassing toegang probeert te krijgen tot de database voor deze pagina, werkt Code First het databaseschema bij en voert de Seed methode uit. Wanneer de pagina wordt weergegeven, ziet u de verwachte kolom Geboortedatum met datums erin.

  4. Klik in de Web One Click Publish werkbalk, klik op het Staging publicatieprofiel en klik vervolgens op Web publiceren.

  5. Voer de pagina Instructeurs uit in de testomgeving om te verifiëren of de update succesvol is geïmplementeerd.

  6. Klik in de werkbalk Web One Click Publish op het publicatieprofiel Productie en klik vervolgens op Publiceren.

  7. Voer de pagina Instructeurs in productie uit om te controleren of de update is geïmplementeerd.

    Voor een echte update van een productietoepassing die een databasewijziging omvat, zou u de toepassing doorgaans ook offline halen tijdens de implementatie met behulp van app_offline.htm, zoals u in de vorige zelfstudie hebt gezien.

Een database-update implementeren met behulp van de dbDacFx-provider

In deze sectie voegt u een kolom Opmerkingen toe aan de tabel Gebruiker in de lidmaatschapsdatabase en maakt u een pagina waarmee u opmerkingen voor elke gebruiker kunt weergeven en bewerken. Vervolgens implementeert u de wijzigingen om te testen, faseren en productie.

Een kolom toevoegen aan een tabel in de lidmaatschapsdatabase

  1. Open SQL Server Object Explorer in Visual Studio.

  2. Vouw (localdb)\v11.0 uit, vouw Databases uit, vouw aspnet-ContosoUniversity (niet aspnet-ContosoUniversity-Prod) uit en vouw vervolgens Tabellen uit.

    Als u (localdb)\v11.0 niet ziet onder het SQL Server-knooppunt , klikt u met de rechtermuisknop op het SQL Server-knooppunt en klikt u op SQL Server toevoegen. Voer in het dialoogvenster Verbinding maken met server(localdb)\v11.0 in als servernaam en klik vervolgens op Verbinding maken.

    Als u aspnet-ContosoUniversity niet ziet, voert u het project uit en meldt u zich aan met de beheerdersreferenties (wachtwoord is devpwd) en vernieuwt u vervolgens het venster SQL Server Object Explorer .

  3. Klik met de rechtermuisknop op de tabel Gebruikers en klik vervolgens op Weergaveontwerper.

    SSOX View Designer

  4. Voeg in de ontwerpfunctie een kolom Opmerkingen toe en maak deze nvarchar(128) en nullable en klik vervolgens op Bijwerken.

    Kolom Opmerkingen toevoegen

  5. Klik in het vak Updates van preview-databases op Database bijwerken.

    Preview-databaseupdates

Een pagina maken om de nieuwe kolom weer te geven en te bewerken

  1. Klik in Solution Explorer met de rechtermuisknop op de map Account in het Project ContosoUniversity, klik op Toevoegen en klik vervolgens op Nieuw item.

  2. Maak een nieuw webformulier met behulp van basispagina en geef het UserInfo.aspx een naam. Accepteer het standaardbestand Site.Master als basispagina.

  3. Kopieer de volgende markeringen naar het MainContentContent element (de laatste van de drie Content elementen):

    <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. Klik met de rechtermuisknop op de pagina UserInfo.aspx en klik op Weergeven in browser.

  5. Meld u aan met de gebruikersreferenties van uw beheerder (wachtwoord is devpwd) en voeg enkele opmerkingen toe aan een gebruiker om te controleren of de pagina correct werkt.

    Schermopname van de pagina UserInfo met de test UserName en het testaccount van Comment Tom.

  6. Sluit de browser.

De database-update implementeren

Als u wilt implementeren met behulp van de dbDacFx-provider, hoeft u alleen de optie Database bijwerken in het publicatieprofiel te selecteren. Voor de eerste implementatie toen u deze optie gebruikte, hebt u echter ook enkele extra SQL-scripts geconfigureerd om uit te voeren: deze bevinden zich nog steeds in het profiel en u moet voorkomen dat ze opnieuw worden uitgevoerd.

  1. Open de wizard Publiceren door met de rechtermuisknop op het Project ContosoUniversity te klikken en op Publiceren te klikken.

  2. Selecteer het testprofiel .

  3. Klik op het tabblad Instellingen .

  4. Selecteer Onder DefaultConnection de optie Database bijwerken.

  5. Schakel de extra scripts uit die u hebt geconfigureerd voor uitvoering voor de eerste implementatie:

    1. Klik op Database-updates configureren.
    2. Schakel in het dialoogvenster Database-updates configureren de selectievakjes naast Grant.sql en aspnet-data-dev.sql uit.
    3. Klik op sluiten.
  6. Klik op het tabblad Voorbeeld .

  7. Klik onder Databases en rechts van DefaultConnection op de koppeling Voorbeelddatabase .

    Databasevoorbeeld

    In het voorbeeldvenster ziet u het script dat wordt uitgevoerd in de doeldatabase om ervoor te zorgen dat het databaseschema overeenkomt met het schema van de brondatabase. Het script bevat een ALTER TABLE-opdracht waarmee de nieuwe kolom wordt toegevoegd.

  8. Sluit het dialoogvenster Databasevoorbeeld en klik vervolgens op Publiceren.

    Visual Studio implementeert de bijgewerkte toepassing en de browser wordt geopend op de startpagina.

  9. Voer de pagina UserInfo ( account/UserInfo.aspx toe aan de URL van de startpagina) om te controleren of de update is geïmplementeerd. U moet zich aanmelden door de beheerder en devpwd in te voeren.

    Gegevens in tabellen worden niet standaard geïmplementeerd en u hebt geen script voor gegevensimplementatie geconfigureerd dat moet worden uitgevoerd, dus u vindt de opmerking die u in ontwikkeling hebt toegevoegd niet. U kunt nu een nieuwe opmerking toevoegen in fasering om te controleren of de wijziging is geïmplementeerd in de database en de pagina correct werkt.

  10. Volg dezelfde procedure om naar de stagingomgeving en productie te deployen.

    Vergeet niet om de extra scripts uit te schakelen. Het enige verschil in vergelijking met het testprofiel is dat u slechts één script in de faserings- en productieprofielen uitschakelt, omdat ze zijn geconfigureerd om slechts aspnet-prod-data.sql uit te voeren.

    De inloggegevens voor staging en productie zijn admin en prodpwd.

    Voor een echte update van een productietoepassing die een databasewijziging bevat, kunt u de toepassing ook offline halen tijdens de implementatie door app_offline.htmte uploaden voordat u deze later publiceert en verwijdert, zoals u in de vorige zelfstudie hebt gezien.

Overzicht

U hebt nu een toepassingsupdate geïmplementeerd die een databasewijziging bevatte met zowel Code First Migrations als de dbDacFx-provider.

Schermopname van de pagina Docenten met hun Naam, Indiensttredingsdatum, Geboortedatum en Kantooropdracht.

Schermopname van de pagina UserInfo met de test UserName en het testaccount van Comment Tom.

In de volgende handleiding ziet u hoe u implementaties uitvoert met behulp van de commandoregel.