Hier ist das Szenario. Es gibt einen Web-API-Aufruf, um ein Objekt in der SQL Server-Datenbank zu ändern. Wir wollen nur die Felder auf dem Datenbankobjekt ändern, wenn sie explizit in Webapi Call Json angegeben wurden. Zum Beispiel:WebApi Legen Sie fest, wie nicht spezifizierte Eigenschaften von den angegebenen Eigenschaften auf null gesetzt werden sollen.
{ "Name":"newName", "Colour":null }
Das sollte das Feld Name in "newName" und "Color" -Feld auf Null ändern. Im Gegensatz zu diesem json:
, die nur das Feld Name ändern sollte, den alten Wert Farbe intakt lassen.
Was ist ein guter Weg mit WebApi festzustellen, ob eine Eigenschaft übergeben wurde oder nicht?
Wenn ich meine Methode wie folgt definieren:
[HttpPut]
[Route("/item/{id}")]
public void ChangeItem(int id, Item item)
{
...
}
item.Colour
wird in beiden Fällen null sein. Beachten Sie, dass ich mit einer Vielzahl von Datentypen hier und Eigentum Colour
im Beispiel gerade arbeitete int
sein könnte, string
, DateTime
, Guid
usw.
Ich verstehe, dass ich das rohe json mit [FromBody]
Attribute erhalten und dann Parsen Sie es selbst, aber es scheint, dass die Standard-Binder bereits die meiste Arbeit (einschließlich Validierung) tut, also wäre ich neugierig, wie ich es wiederverwenden könnte, sondern auch erreichen, was ich will. Was ist der einfachste Weg?
aktualisieren:
ich das meine klären möchte ein „gelegentlich verbunden“ -Szenario. Das heißt, die Geräte, die die API verwenden, sind die meiste Zeit außerhalb der Netzabdeckung und synchronisieren sich von Zeit zu Zeit mit der API.
Praktisch bedeutet dies, dass die größte Teil der Daten, die für die Synchronisierung aggregiert werden in null oder einem „Push-Updates zum Server“ Aufruf von „get neuesten Stand vom Server“ Aufruf gefolgt benötigt wird. Mit Sql Server und EF im Backend, das zu mehreren unterschiedlichen (und manchmal nicht miteinander verwandten) Entitäten führt, sind in einzelnen JSON enthalten. ZB:
class TaskData
{
public IList<User> AssignedUsers {get; set;}
public IList<Product> Products {get; set;}
public Task Task {get; set}
}
Auch die Modellklassen, die verwendet werden json für GET Anrufe sind von EF entites getrennt zu erzeugen, wie das Datenbankschema nicht genau das Modell API-Objekt entsprechen.
Um ehrlich zu sein, Put ist idempotent. Du brauchst _patch _... –
@AndreiV, yeah, yeah. Lassen Sie uns nicht darüber diskutieren, was pure Ruhe ist und was nicht =) –
Ich mag es auch nicht ... Als Workaround könnten Sie eine Liste von _changing Eigenschaften_ als zusätzlichen Parameter benötigen. –