Freigeben über


Gewusst wie: Übernehmen von an einem getrennten Objekt vorgenommenen Änderungen (Entity Framework)

In diesem Thema wird anhand eines Beispiels gezeigt, wie Aktualisierungen für ein Objekt übernommen werden, die an einer getrennten Instanz desselben Objekts vorgenommen wurden. Dieses Verfahren wird verwendet, wenn ein Objekt remote aktualisiert und an den Server zurück übergeben wird, um die Änderungen zu speichern. Würde das Objekt einfach an einen Objektkontext auf dem Server angefügt, würden die Aktualisierungen verloren gehen oder die Operation würde fehlschlagen, wenn das Objekt bereits im Objektkontext vorhanden wäre. Der Grund hierfür ist, dass Objekte im Unchanged-Zustand angefügt werden. Weitere Informationen finden Sie unter Anfügen von Objekten (Entity Framework).

Das Beispiel in diesem Thema beruht auf dem AdventureWorks Sales-Modell. Zum Ausführen des Codes in diesem Beispiel müssen Sie dem Projekt bereits das AdventureWorks Sales-Modell hinzugefügt und das Projekt zur Verwendung des Entity Framework konfiguriert haben. Führen Sie dazu die Verfahren unter Gewusst wie: Manuelles Konfigurieren eines Entity Framework-Projekts und Gewusst wie: Manuelles Definieren eines Entity Data Model (Entity Framework) durch.

Beispiel

Im folgenden Beispiel wird ein aktualisiertes SalesOrderDetail-Objekt zusammen mit dem ursprünglichen Objekt an die UpdateItemChanges-Methode übergeben. Dadurch können Änderungen übernommen werden, ohne das Objekt abzufragen oder es im Speicher zu halten.

Private Shared Sub ApplyItemUpdates(ByVal originalItem As SalesOrderDetail, _
    ByVal updatedItem As SalesOrderDetail)
    Using advWorksContext As AdventureWorksEntities = _
        New AdventureWorksEntities()
        Try

            ' Attach the original item to the object context.
            advWorksContext.Attach(originalItem)

            ' Call the ApplyPropertyChanges method to apply changes
            ' from the updated item to the original version.
            advWorksContext.ApplyPropertyChanges( _
                "SalesOrderDetail", updatedItem)

            advWorksContext.SaveChanges()

        Catch ex As InvalidOperationException
            Console.WriteLine(ex.ToString())
        End Try
    End Using
End Sub
private static void ApplyItemUpdates(SalesOrderDetail originalItem,
    SalesOrderDetail updatedItem)
{
    using (AdventureWorksEntities advWorksContext = 
        new AdventureWorksEntities())
    {
        try
        {
            // Attach the original item to the object context.
            advWorksContext.Attach(originalItem);

            // Call the ApplyPropertyChanges method to apply changes
            // from the updated item to the original version.
            advWorksContext.ApplyPropertyChanges("SalesOrderDetail",
                updatedItem);

            advWorksContext.SaveChanges();
        }
        catch (InvalidOperationException ex)
        {
            Console.WriteLine(ex.ToString());
        }
    }
}

In diesem Beispiel wird das ursprüngliche SalesOrderDetail-Objekt abgerufen. Anschließend werden Änderungen für das Objekt auf der Grundlage eines aktualisierten SalesOrderDetail-Objekts, das an die UpdateItemChanges-Methode übergeben wird, übernommen.

Private Shared Sub ApplyItemUpdates(ByVal updatedItem As SalesOrderDetail)
    ' Define an ObjectStateEntry and EntityKey for the current object.
    Dim key As EntityKey
    Dim originalItem As Object

    Using advWorksContext As AdventureWorksEntities = _
        New AdventureWorksEntities()
        Try
            ' Create the detached object's entity key.
            key = advWorksContext.CreateEntityKey("SalesOrderDetail", updatedItem)

            ' Get the original item based on the entity key from the context
            ' or from the database.
            If advWorksContext.TryGetObjectByKey(key, originalItem) Then
                ' Call the ApplyPropertyChanges method to apply changes
                ' from the updated item to the original version.
                advWorksContext.ApplyPropertyChanges( _
                    key.EntitySetName, _
                    updatedItem)
            End If

            advWorksContext.SaveChanges()
        Catch ex As InvalidOperationException
            Console.WriteLine(ex.ToString())
        End Try

    End Using
End Sub
private static void ApplyItemUpdates(SalesOrderDetail updatedItem)
{
    // Define an ObjectStateEntry and EntityKey for the current object.
    EntityKey key;
    object originalItem;

    using (AdventureWorksEntities advWorksContext =
        new AdventureWorksEntities())
    {
        try
        {
            // Create the detached object's entity key.
            key = advWorksContext.CreateEntityKey("SalesOrderDetail", updatedItem);
            
            // Get the original item based on the entity key from the context
            // or from the database.
            if (advWorksContext.TryGetObjectByKey(key, out originalItem))
            {
                // Call the ApplyPropertyChanges method to apply changes
                // from the updated item to the original version.
                advWorksContext.ApplyPropertyChanges(
                    key.EntitySetName, updatedItem);
            }

            advWorksContext.SaveChanges();
        }
        catch (InvalidOperationException ex)
        {
            Console.WriteLine(ex.ToString());
        }
    }
}

Siehe auch

Konzepte

Webdienste und das Entity Data Model (Anwendungsszenarios)
Serialisieren von Objekten (Entity Framework)
Anfügen von Objekten (Entity Framework)

Weitere Ressourcen

Arbeiten mit Objekten (Entity Framework-Aufgaben)