Dela via


Hierarkisk uppdatering i .NET Framework-utveckling

Anmärkning

Klassen DataSet och relaterade klasser är äldre .NET Framework-tekniker från början av 2000-talet som gör det möjligt för program att arbeta med data i minnet medan apparna kopplas från databasen. Teknikerna är särskilt användbara för appar som gör det möjligt för användare att ändra data och spara ändringarna tillbaka till databasen. Även om datauppsättningar är en bevisad framgångsrik teknik är den rekommenderade metoden för nya .NET-program att använda Entity Framework Core. Entity Framework är ett mer naturligt sätt att arbeta med tabelldata som objektmodeller och har ett enklare programmeringsgränssnitt.

Hierarkisk uppdatering avser processen att spara uppdaterade data (från en datauppsättning med två eller flera relaterade tabeller) tillbaka till en databas samtidigt som referensintegritetsregler upprätthålls. Referensintegritet refererar till konsekvensreglerna som tillhandahålls av begränsningarna i en databas som styr beteendet att infoga, uppdatera och ta bort relaterade poster. Det är till exempel referensintegritet som framtvingar skapandet av en kundpost innan order skapas för kunden. Mer information om relationer i datauppsättningar finns i Relationer i datauppsättningar.

Den hierarkiska uppdateringsfunktionen använder en TableAdapterManager för att hantera TableAdapter:er i ett typat dataset. Komponenten TableAdapterManager är en Visual Studio-genererad klass, inte en .NET-typ. När du drar en tabell från fönstret Datakällor till en Windows-formulär- eller WPF-sida lägger Visual Studio till en variabel av typen TableAdapterManager till formuläret eller sidan, och du ser den i designern i komponentfältet. Detaljerad information om klassen finns i TableAdapterManager avsnittet TableAdapterManager-referens i TableAdapters.

Som standardinställning hanterar en dataset relaterade tabeller som "Endast Relationer," vilket innebär att den inte tillämpar främmande nyckelbegränsningar. Du kan ändra den inställningen vid designtillfället med hjälp av Datauppsättningsdesignern. Välj relationslinjen mellan två tabeller för att visa dialogrutan Relation . De ändringar du gör här avgör hur de TableAdapterManager fungerar när ändringarna i de relaterade tabellerna skickas tillbaka till databasen.

Aktivera hierarkisk uppdatering i en datauppsättning

Som standard är hierarkisk uppdatering aktiverad för alla nya datauppsättningar som läggs till eller skapas i ett projekt. Aktivera eller inaktivera hierarkisk uppdatering genom att ange egenskapen Hierarkisk uppdatering för en typdatauppsättning i Datauppsättningen till Sant eller Falskt:

Hierarkisk uppdateringsinställning

Skapa en ny relation mellan tabeller

Om du vill skapa en ny relation mellan två tabeller går du till Datauppsättningsdesignern, väljer namnlisten för varje tabell och högerklickar och väljer Lägg till relation.

Hierarkisk uppdateringsmeny för att lägga till relation

Förstå begränsningar för främmande nyckel, kaskaduppdateringar och -borttagningar

Det är viktigt att förstå hur foreign-key-begränsningar och kaskadbeteende i databasen skapas i den genererade datasetkoden.

Som standard genereras datatabellerna i en datauppsättning med relationer (DataRelation) som matchar relationerna i databasen. Relationen i datamängden genereras dock inte som en utländsk nyckelbegränsning. DataRelation är konfigurerad som Endast relation utan UpdateRule eller DeleteRule i bruk.

Som standard inaktiveras sammanhängande uppdateringar och sammanhängande borttagningar även om databasrelationen har angetts med sammanhängande uppdateringar eller sammanhängande borttagningar aktiverade. Om du till exempel skapar en ny kund och en ny order och sedan försöker spara data kan det orsaka en konflikt med främmande nyckelbegränsningar som definieras i databasen. Mer information finns i Inaktivera begränsningar när du fyller i en datauppsättning.

Ange ordningen för att utföra uppdateringar

Om du anger ordningen för att utföra uppdateringar anges ordningen för de enskilda infogningar, uppdateringar och borttagningar som krävs för att spara alla ändrade data i alla tabeller i en datauppsättning. När hierarkisk uppdatering är aktiverad utförs infogningar först, sedan uppdateras och tas sedan bort. TableAdapterManager Tillhandahåller en UpdateOrder egenskap som kan ställas in för att utföra uppdateringar först, sedan infogar och sedan tar bort.

Anmärkning

Det är viktigt att förstå att uppdateringsordningen är heltäckande. När uppdateringar utförs utförs alltså infogningar och sedan borttagningar för alla tabeller i datauppsättningen.

Om du vill ange UpdateOrder egenskapen väljer du i komponentfältet när du har dragit objekt från TableAdapterManager till ett formulär och anger UpdateOrder sedan egenskapen i fönstret Egenskaper.

Skapa en säkerhetskopia av en datauppsättning innan du utför en hierarkisk uppdatering

När du sparar data (genom att anropa TableAdapterManager.UpdateAll() metoden) TableAdapterManager försöker du uppdatera data för varje tabell i en enda transaktion. Om någon del av uppdateringen för en tabell misslyckas återställs hela transaktionen. I de flesta situationer återställer återställningen din applikation till dess ursprungliga tillstånd.

Ibland kanske du dock vill återställa datauppsättningen från säkerhetskopian. Ett exempel på detta kan inträffa när du använder automatiskt inkrementella värden. Om en sparande åtgärd till exempel inte lyckas återställs inte automatiskt inkrementella värden i datauppsättningen och datauppsättningen fortsätter att skapa automatiskt inkrementella värden. Detta lämnar en lucka i numreringen som kanske inte är acceptabel i din applikation. I situationer där det här är ett problem TableAdapterManager tillhandahåller den en BackupDataSetBeforeUpdate egenskap som ersätter den befintliga datauppsättningen med en säkerhetskopia om transaktionen misslyckas.

Anmärkning

Säkerhetskopian finns bara i minnet medan TableAdapterManager.UpdateAll metoden körs. Därför finns det ingen programmatisk åtkomst till den här säkerhetskopieringsdatauppsättningen eftersom den antingen ersätter den ursprungliga datauppsättningen eller går utanför omfånget TableAdapterManager.UpdateAll så snart metoden har körts.

Ändra den genererade spara koden för att utföra den hierarkiska uppdateringen

Spara ändringar från relaterade datatabeller i datauppsättningen till databasen genom att anropa TableAdapterManager.UpdateAll metoden och skicka namnet på den datauppsättning som innehåller de relaterade tabellerna. Kör till exempel TableAdapterManager.UpdateAll(NorthwindDataset) metoden för att skicka uppdateringar från alla tabeller i NorthwindDataset till serverdelsdatabasen.

När du har lagt ned objekten från fönstret Datakällor läggs kod automatiskt till i Form_Load händelsen för att fylla i varje tabell ( TableAdapter.Fill metoderna). Kod läggs också till i knappens Spara klickhändelse BindingNavigator för att spara data från datasetet tillbaka till databasen (TableAdapterManager.UpdateAll metoden).

Den genererade spara koden innehåller också en kodrad som anropar CustomersBindingSource.EndEdit metoden. Mer specifikt anropar den metoden EndEdit för den första BindingSource som läggs till i formuläret. Med andra ord genereras den här koden bara för den första tabellen som dras från fönstret Datakällor till formuläret. Anropet EndEdit genomför alla ändringar som pågår i alla databundna kontroller som för närvarande redigeras. Om en databunden kontroll fortfarande har fokus och du klickar på knappen Spara utförs därför alla väntande ändringar i kontrollen före den faktiska sparandet ( TableAdapterManager.UpdateAll metoden).

Anmärkning

Datauppsättningsdesignern lägger bara till BindingSource.EndEdit koden för den första tabellen som släpps i formuläret. Därför måste du lägga till en kodrad för att anropa BindingSource.EndEdit metoden för varje relaterad tabell i formuläret. För den här genomgången innebär det att du måste lägga till ett anrop till OrdersBindingSource.EndEdit metoden.

  1. Dubbelklicka på knappen SparaBindingNavigator för att öppna Formulär1 i kodredigeraren.

  2. Lägg till en kodrad för att anropa OrdersBindingSource.EndEdit metoden efter raden som anropar CustomersBindingSource.EndEdit metoden. Koden i klickhändelsen för knappen Spara bör likna följande:

    this.Validate();
    this.customersBindingSource.EndEdit();
    this.ordersBindingSource.EndEdit();
    this.tableAdapterManager.UpdateAll(this.northwindDataSet);
    

Förutom att bekräfta ändringar i en relaterad underordnad tabell innan du sparar data i en databas, kan du också behöva bekräfta nyskapade överordnade poster innan du lägger till nya underordnade poster i en datauppsättning. Med andra ord kan du behöva lägga till den nya överordnade posten (Customer) i datauppsättningen innan begränsningar för främmande nycklar möjliggör att nya underordnade poster (Orders) kan läggas till i datauppsättningen. För att åstadkomma detta kan du använda barnhändelsen BindingSource.AddingNew.

Anmärkning

Om du måste spara nya överordnade poster beror på vilken typ av kontroll som används för att binda till datakällan. I den här genomgången använder du enskilda kontroller för att binda till den överordnade tabellen. Detta kräver ytterligare kod för att kommittera den nya överordnade posten. Om de överordnade posterna i stället visades i en komplex bindningskontroll som DataGridView, skulle detta ytterligare EndEdit-anrop för den överordnade posten inte vara nödvändigt. Det beror på att kontrollens underliggande databindningsfunktion hanterar åtagandet av de nya posterna.

Lägg till kod för att committera överordnade poster i datamängden före nya underordnade poster läggs till.

  1. Skapa en händelsehanterare för händelsen OrdersBindingSource.AddingNew.

    • Öppna Formulär1 i designvyn, välj OrdersBindingSource i komponentfältet, välj Händelser i fönstret Egenskaper och dubbelklicka sedan på händelsen AddNew .
  2. Lägg till en kodrad i händelsehanteraren som anropar CustomersBindingSource.EndEdit metoden. Koden i OrdersBindingSource_AddingNew händelsehanteraren bör likna följande:

    this.customersBindingSource.EndEdit();
    

TableAdapterManager-referens

Som standard genereras en TableAdapterManager klass när du skapar en datauppsättning som innehåller relaterade tabeller. Om du vill förhindra att klassen genereras ändrar du värdet för datamängdens Hierarchical Update egenskap till false. När du drar en tabell som har en relation till designytan på en Windows-formulär- eller WPF-sida deklarerar Visual Studio en medlemsvariabel för klassen. Om du inte använder databindning måste du deklarera variabeln manuellt.

Klassen TableAdapterManager är inte en .NET-typ. Därför kan du inte leta upp det i dokumentationen. Den skapas under designfasen som en del av datamängdsskapandeprocessen.

Följande är de metoder och egenskaper som används ofta för TableAdapterManager klassen:

Medlem Beskrivning
UpdateAll metod Sparar alla data från alla datatabeller.
BackUpDataSetBeforeUpdate egenskap Avgör om en säkerhetskopia av datauppsättningen ska skapas innan TableAdapterManager.UpdateAll-metoden körs. Boolean.
egenskapen för tabellnamnet TableAdapter Representerar en TableAdapter. Den genererade TableAdapterManager innehåller en egenskap för varje TableAdapter som hanteras. Till exempel genereras en datauppsättning med tabellen Kunder och Beställningar med en TableAdapterManager som innehåller CustomersTableAdapter och OrdersTableAdapter egenskaper.
UpdateOrder egenskap Styr ordningen på de enskilda kommandona för att infoga, uppdatera och ta bort. Ange detta till ett av värdena i TableAdapterManager.UpdateOrderOption uppräkningen.

Som standard är UpdateOrder inställt på InsertUpdateDelete. Det innebär att infogningar, uppdateringar och sedan borttagningar utförs för alla tabeller i datauppsättningen.