Nehmen wir an, ich frage die Datenbank ab und lade eine Liste mit Elementen. Dann öffne ich eines der Elemente in einer Detailansicht und anstatt das Element erneut aus der Datenbank abzufragen, erstelle ich eine Instanz des Elements aus der Datenquelle in der Liste.
Gibt es eine Möglichkeit, den Datenbankeintrag zu aktualisieren, ohne den Datensatz des einzelnen Elements abzurufen?
Hier ist ein Beispiel, wie ich es jetzt mache:
dataItem itemToUpdate = (from t in dataEntity.items
where t.id == id
select t).FirstOrDefault();
Nachdem ich den Datensatz abgerufen habe, aktualisiere ich einige Werte im Element und schiebe den Datensatz zurück:
itemToUpdate.itemstatus = newStatus;
dataEntity.SaveChanges();
Ich würde denken, es gäbe einen besseren Weg, dies zu tun, irgendwelche Ideen?
c#
entity-framework
Shane Grant
quelle
quelle
Antworten:
Sie sollten die Attach () -Methode verwenden.
Objekte anbringen und abnehmen
quelle
Sie können auch direktes SQL für die Datenbank im Kontext des Datenspeichers verwenden. Beispiel:
Aus Leistungsgründen möchten Sie möglicherweise Variablen anstelle einer einzelnen fest codierten SQL-Zeichenfolge übergeben. Dadurch kann SQL Server die Abfrage zwischenspeichern und mit Parametern wiederverwenden. Beispiel:
UPDATE - für EF 6.0
quelle
ExecuteStoreCommand
ist nicht wirklich eine EF-Methode, sondern verwendet nur das darinDbConnection
enthalteneDbContext
, um einen Befehl auszuführen. Es ist nicht datenbankunabhängig, geschweige denn persistenzunabhängig (z. B. würde dieses Beispiel abstürzen, wenn das OP auf XML umgestellt würde).Der Code:
Das Ergebnis TSQL:
Hinweis:
Die Zeile "IsModified = true" wird benötigt, da beim Erstellen des neuen ExampleEntity-Objekts (nur mit der aufgefüllten Id-Eigenschaft) alle anderen Eigenschaften ihre Standardwerte (0, null usw.) haben. Wenn Sie die Datenbank mit einem "Standardwert" aktualisieren möchten, wird die Änderung vom Entitätsframework nicht erkannt, und die Datenbank wird nicht aktualisiert.
Zum Beispiel:
funktioniert nicht ohne die Zeile "IsModified = true", da die Eigenschaft ExampleProperty bereits null ist, als Sie das leere ExampleEntity-Objekt erstellt haben. Sie müssen EF mitteilen, dass diese Spalte aktualisiert werden muss, und dies ist der Zweck dieser Zeile.
quelle
Wenn die
DataItem
EF-Felder EF vorab validieren (wie nicht nullbare Felder), müssen wir diese Validierung für diesen Kontext deaktivieren:Andernfalls können wir versuchen, die Vorvalidierung zu erfüllen und trotzdem nur die einzelne Spalte zu aktualisieren:
Angenommen,
dataEntity
ist aSystem.Data.Entity.DbContext
Sie können die generierte Abfrage überprüfen, indem Sie Folgendes hinzufügen
DbContext
:quelle
In diesem Artikel im Rahmen von Microsoft Erste Schritte werden die Entitätszustände und die Vorgehensweise erläutert:
Add / Attach und Entity States
Schauen Sie sich den Abschnitt 'Anhängen einer vorhandenen, aber geänderten Entität an den Kontext' an.
Jetzt gehe ich los, um den Rest dieser Tutorials zu lesen.
quelle
In EF Core funktioniert das etwas anders:
In EF Core gibt es möglicherweise eine schnellere Möglichkeit, dies zu tun. Im Folgenden wird jedoch ein UPDATE sichergestellt, ohne dass ein SELECT durchgeführt werden muss (getestet mit EF Core 2 und JET unter .NET Framework 4.6.2):
Stellen Sie sicher, dass Ihr Modell keine IsRequired-Eigenschaften hat
Verwenden Sie dann die folgende Vorlage (in VB.NET):
quelle
Wenn Sie Entity Framework zum Abfragen aller Elemente verwendet und das Entitätsobjekt gespeichert haben, können Sie im Allgemeinen die einzelnen Elemente im Entitätsobjekt aktualisieren und aufrufen,
SaveChanges()
wenn Sie fertig sind. Beispielsweise:Das Abrufen des gewünschten Elements sollte keine neue Abfrage generieren.
quelle