3 Stimmen

Senden von Teilobjekten mit nur geänderten Feldern an Web API und Entity Framework

WebApi und EF POCOs arbeiten sehr gut zusammen. Ein Problem, über das ich nachgedacht habe, ist, dass einige Objekte im Laufe der Zeit wirklich sehr groß werden können. Sie können viele Eigenschaften haben, die sich auf Spalten in der Datenbank zurückführen lassen. Bei diesen Objekten werden selten mehr als ein oder zwei Felder auf einmal aktualisiert, so dass sich die Frage stellt, warum alle Felder den gesamten Weg vom Client zum Server und zurück zur Datenbank zurücklegen müssen.

Einige JavaScript-Frameworks bieten die Möglichkeit, entweder alle Felder oder nur die geänderten Felder an den Server zurückzusenden, so dass die Client-Seite sauber und einfach ist.

Die Serverseite ist, soweit ich sehe, eine etwas größere Herausforderung. Der Serialisierer wird Schritt in und versuchen, einige Json oder Xml zu einem Typ zuordnen. JSON.NET zum Beispiel behandelt fehlende Werte gut, sofern die entsprechenden Eigenschaften im Objekt nullable sind.

Die Wiederanbindung des deserialisierten Modells an das Entity-Framework hingegen ist der Punkt, an dem es schwierig wird. Das Standard-WebApi-Template für einen Controller erledigt dies in einer Zeile:

db.Entry(user).State = EntityState.Modified;

Dadurch wird natürlich das gesamte Objekt auf geändert gesetzt. Es ist natürlich möglich, einzelne Eigenschaften auf "modifiziert" zu setzen und nicht das gesamte Objekt. Ich würde annehmen, dass dies bedeutet, dass EF ein wenig cleverer ist und nur die modifizierten Eigenschaften im SQL UPDATE zurückschickt.

Das Problem ist also, woher weiß ich, welche Eigenschaften aktualisiert werden? Ich erhalte nur ein Objekt zurück in meinem Controller-Methode, so dass ich nicht fragen, die Serializer, welche Eigenschaften es zog in (selbst wenn das für einen bestimmten Serializer möglich war). Wenn ich eine Liste von Eigenschaften haben, dann könnte ich aktuelle Werte mit ihrem Zustand in EF geändert und hoffentlich, die in meine saubere Datenbankabfrage führen sollte.

Die andere, vielleicht naheliegendere Möglichkeit besteht darin, zunächst das zu aktualisierende Objekt aus einer Datenbank abzurufen und dann nur die geänderten Eigenschaften des abgerufenen Objekts einzeln zu ändern, oder, wenn EF dies unterstützt, kann ich vielleicht das nicht verbundene Objekt übergeben und es dies selbst tun lassen. Diese Option ist nicht so wünschenswert, da sie ein komplettes Einlesen der Datenbank bedeutet, wo doch der Sinn der Übung die Effizienz ist. Wir würden die http-Effizienz und Bandbreite des Clients gegen die Effizienz der Verbindung zwischen Server und Datenbank eintauschen.

Wenn ich dies also auf dem Server tun möchte, stehe ich zwischen einem Stein und einem harten Ort. WebApi und EF tun die meisten der Arbeit, aber auf Kosten der Flexibilität. Ich bin auf der Suche nach Optionen oder Winkeln, die ich nicht erwähnt habe, in der Hoffnung auf eine einfache Lösung, die nicht wegwerfen eine dieser beiden großen Technologien.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X