Come impostare la proprietà nullable / facoltativa dell'oggetto database su NULL nel backend?

1

Stiamo costruendo API che principalmente trasferisce gli oggetti del database avanti e indietro tra utente e database, quindi il flusso principale di informazioni è piuttosto semplice:

Table (view) <-- ORM --> C#/Java/etc. Objects <-- JSON serializer --> JSON objects <-- HTTP --> User

Stiamo utilizzando ASP.NET Core con Entity Framework Core se è importante, ma credo che questa sia una domanda agnostica almeno in qualche modo tecnologica.

La maggior parte dei nostri oggetti di back-end mappati dal DB contengono molte proprietà opzionali, il che significa che sono annullabili nel database. Ovviamente, ciò implicherebbe che tali proprietà dovrebbero anche essere Nullable / Optional / WhateverInYourLanguage nel mondo orientato agli oggetti.

Ora il problema sorge quando l'utente vorrebbe impostare una proprietà esistente di qualche oggetto su null. Potremmo quindi ricevere magari seguendo il tipo di aggiornamento JSON da parte dell'utente (molti dettagli omessi e la struttura è stupida, non importa di quello):

{
    "TargetType": "Foo",
    "Id": 65,
    "NullableProperty": null
}

Quindi l'utente vorrebbe impostare il valore della proprietà NullableProperty su null per un oggetto con il tipo di Foo e con Id di 65 . Tutto bene e bene finora.

In primo luogo, stavamo pensando di generare un oggetto di tipo Foo da JSON ricevuto e di aggiornare l'oggetto di database esistente con quello, ma questo porterebbe a una situazione in cui tutte le proprietà dell'oggetto creato sarebbero nulle, quindi come faremmo sapere quali proprietà aggiornare?

Forse un'altra soluzione potrebbe avere una funzione di aggiornamento che avrebbe tutti i parametri di proprietà facoltativi impostati su null, ma questo porterebbe allo stesso problema, significherebbe che il valore per quella proprietà non è stato fornito o il valore nullo fornito dall'utente?

Quindi abbiamo pensato che l'utente avrebbe dovuto inviare un intero oggetto dati tramite json, che avrebbe contenuto tutti i valori necessari e sarebbe stato semplicemente copiato sull'oggetto del database. Questo non funzionerà per diversi motivi (molte volte gli utenti ricevono solo parti di un oggetto, le dimensioni degli oggetti possono essere piuttosto grandi, c'è il rischio di perdere dati, ecc.)

Un altro modo che non siamo troppo desiderosi di implementare è riservare un valore speciale per indicare null per ogni tipo di dati. Per esempio la data 9999-99-99 potrebbe significare nulla per le date, il numero MinInt significherebbe nulla per i numeri interi e "" sarebbe nullo per le stringhe, ecc. Potrebbe funzionare almeno in una certa misura, ma anche ora mi fa rabbrividire a pensarci.

Esiste un buon modello di progettazione per questo tipo di situazioni? Ho dato questo ora un pensiero, ma non riesco a trovare conclusioni migliori di quelle sopra elencate.

    
posta Tuomas Kujala 10.10.2018 - 08:22
fonte

1 risposta

4

Se la tua API JSON consente l'invio di oggetti parziali per gli aggiornamenti (come in, una richiesta di aggiornamento dell'oggetto 65 di tipo Foo contiene solo un sottoinsieme delle proprietà di tipo Foo ), quindi la più sensibile approccio è che le proprietà che non sono menzionate nella descrizione JSON non saranno modificate.

Ciò significa che se ottieni una richiesta di aggiornamento con il documento JSON

{
    "TargetType": "Foo",
    "Id": 65,
    "NullableProperty": null
}

quindi lo elabori in questo modo:

  1. Recupera l'oggetto di tipo Foo con Id 65 dal database
  2. Modifica NullableProperty per impostarlo su NULL, lasciando invariate tutte le altre proprietà
  3. Aggiorna il database con l'oggetto modificato

Questo significa che se una proprietà deve essere impostata su NULL, allora deve essere esplicitamente menzionata nell'interfaccia JSON.

    
risposta data 10.10.2018 - 13:07
fonte

Leggi altre domande sui tag