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 und Trennen 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 der Modell- und Zuordnungsdateien (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 beizubehalten. Sie können auch das ursprüngliche Objekt aus der Datenbank abrufen, statt vom Client zu verlangen, dieses Objekt zu übergeben.
Private Shared Sub ApplyItemUpdates(ByVal originalItem As SalesOrderDetail, ByVal updatedItem As SalesOrderDetail)
Using context As New AdventureWorksEntities()
context.SalesOrderDetails.Attach(updatedItem)
' Check if the ID is 0, if it is the item is new.
' In this case we need to chage the state to Added.
If updatedItem.SalesOrderDetailID = 0 Then
' Because the ID is generated by the database we do not need to
' set updatedItem.SalesOrderDetailID.
context.ObjectStateManager.ChangeObjectState(updatedItem, System.Data.EntityState.Added)
Else
' If the SalesOrderDetailID is not 0, then the item is not new
' and needs to be updated. Because we already added the
' updated object to the context we need to apply the original values.
' If we attached originalItem to the context
' we would need to apply the current values:
' context.ApplyCurrentValues("SalesOrderDetails", updatedItem);
' Applying current or original values, changes the state
' of the attached object to Modified.
context.ApplyOriginalValues("SalesOrderDetails", originalItem)
End If
context.SaveChanges()
End Using
End Sub
private static void ApplyItemUpdates(SalesOrderDetail originalItem,
SalesOrderDetail updatedItem)
{
using (AdventureWorksEntities context =
new AdventureWorksEntities())
{
context.SalesOrderDetails.Attach(updatedItem);
// Check if the ID is 0, if it is the item is new.
// In this case we need to chage the state to Added.
if (updatedItem.SalesOrderDetailID == 0)
{
// Because the ID is generated by the database we do not need to
// set updatedItem.SalesOrderDetailID.
context.ObjectStateManager.ChangeObjectState(updatedItem, System.Data.EntityState.Added);
}
else
{
// If the SalesOrderDetailID is not 0, then the item is not new
// and needs to be updated. Because we already added the
// updated object to the context we need to apply the original values.
// If we attached originalItem to the context
// we would need to apply the current values:
// context.ApplyCurrentValues("SalesOrderDetails", updatedItem);
// Applying current or original values, changes the state
// of the attached object to Modified.
context.ApplyOriginalValues("SalesOrderDetails", originalItem);
}
context.SaveChanges();
}
}
Siehe auch
Konzepte
Erstellen von N-Tier-Anwendungen (Entity Framework)
Serialisieren von Objekten (Entity Framework)
Anfügen und Trennen von Objekten (Entity Framework)
Arbeiten mit Objekten (Entity Framework)