Consideriamo il seguente esempio di una classe, che è un'entità che sto usando attraverso Entity Framework.
- InvoiceHeader
- BilledAmount (property, decimal)
- PaidAmount (property, decimal)
- Balance (property, decimal)
Sto cercando di trovare l'approccio migliore per mantenere aggiornato il saldo, in base ai valori delle altre due proprietà (BilledAmount e PaidAmount).
Sono combattuto tra due pratiche qui:
- Aggiornamento della quantità di saldo ogni volta che BilledAmount e PaidAmount vengono aggiornati (tramite i loro setter)
- Avere un metodo UpdateBalance () che i chiamanti dovrebbero eseguire sull'oggetto quando appropriato.
Sono consapevole che posso solo calcolare l'equilibrio nel suo getter. Tuttavia, non è realmente possibile perché questo è un campo entità che deve essere salvato nel database, dove ha una colonna effettiva e dove deve essere persistente l'importo calcolato.
L'altra mia preoccupazione per l'approccio di aggiornamento automatico è che i valori calcolati potrebbero essere leggermente diversi da quelli originariamente salvati nel database, a causa dei valori di arrotondamento (una versione precedente del software utilizzava i float, ma ora i decimali ). Quindi, caricando, diciamo che 2000 entità dal database potrebbero cambiare il loro stato e fare in modo che ORM ritenga che siano state modificate e che siano persistite nel database la prossima volta che il metodo SaveChanges () viene richiamato nel contesto.
Attiverà una massa di aggiornamenti a cui non sono realmente interessato, o potrebbe causare problemi, se i metodi di calcolo fossero cambiati (le entità scaricate perderebbero i loro vecchi valori per essere sostituiti da quelli appena ricalcolati, semplicemente caricando) .
Quindi, prendiamo ulteriormente l'esempio.
Ogni fattura presenta alcuni dettagli relativi alla fattura, che hanno anche BilledAmount, PaidAmount e Balance (sto semplificando il mio business case per l'esempio, quindi supponiamo che il cliente possa pagare separatamente ogni articolo della fattura piuttosto che nel suo complesso).
Se consideriamo che l'entità dovrebbe prendersi cura di se stessa, qualsiasi modifica dei dettagli del bambino dovrebbe comportare anche la modifica dei totali della fattura.
In un approccio completamente automatizzato, una semplice implementazione passerebbe in rassegna ogni dettaglio della fattura per ricalcolare i totali dell'intestazione, ogni volta che cambia la proprietà. Probabilmente andrebbe bene solo per un record, ma se un sacco di entità sono state recuperate contemporaneamente, potrebbe creare un sovraccarico significativo, poiché eseguirà questo processo ogni volta che viene recuperato un nuovo record di dettagli della fattura. Forse peggio, se i dettagli non sono già stati caricati, potrebbe far sì che l'ORM li carichi lentamente, solo per ricalcolare i saldi.
Finora, sono andato con il metodo di aggiornamento (), principalmente per le ragioni che ho spiegato sopra, ma mi chiedo se fosse giusto. Sto notando che devo continuare a chiamare questi metodi abbastanza spesso e in diversi punti del mio codice ed è una potenziale fonte di bug.
Ha anche un effetto dannoso sull'associazione dati poiché quando le proprietà del dettaglio o dell'intestazione cambiano, le altre proprietà non vengono aggiornate e il metodo non può essere chiamato.
Qual è l'approccio consigliato in questo caso?