Diciamo che abbiamo classi come questa:
public class Item1{
public Guid Id {get; set;}
public string Name {get; set;}
public decimal Price {get; set;}
public int Quantity {get; set;}
}
E alcuni altri, che hanno campi aggiuntivi o diversi, altri hanno liste come proprietà.
E quelle classi vengono serializzate in stringhe Xml e posizionate come proprietà di un'altra classe, che verrà salvata nel database.
public class Record{
public Guid Id {get; set;}
public DateTime CreatedOn {get; set;}
public string SerializedItem {get; set;}
}
Quando è necessario, estraiamo il record e deserializziamo in classe Item1 , Item2 o altro. Tutto è bello e bello.
Ma un giorno decidiamo che abbiamo bisogno di una proprietà aggiuntiva Discount . Se lo sconto Price * Quantity > 1000 sarebbe 10 per quell'elemento, se superiore a 5000 sconto 20 e così via. E useremmo quelle classi per mostrarle in una griglia (lista semplice), generare report e probabilmente come una variabile in classi (ad esempio se lo sconto è maggiore di 20 quella voce non potrebbe ottenere una spedizione gratuita o qualcosa del genere). Per non duplicare il calcolo di Discount , decidiamo di avere proprietà aggiuntive nella nostra classe Item1 come public decimal Discount {get; set;} , che viene calcolata durante l'inserimento di questo nuovo elemento.
Quindi ecco il problema che vediamo: quando deserializzando i vecchi articoli non avrebbero questa proprietà, quindi deserializzatore darebbe valori predefiniti come null , 0 , false a seconda del tipo di proprietà. Tuttavia, vogliamo che i vecchi articoli abbiano un valore Discount calcolato in base alla logica che vengono calcolati i nuovi articoli Discount .
Quindi come ottenerlo in modo efficiente? Sarebbe saggio avere un metodo che ricalcoli lo sconto (si noti che potrebbero esserci un paio di migliaia di elementi e la logica sarebbe più complicata) prima di dare questi elementi alla griglia, ai report e da qualche altra parte? O è più efficiente avere uno script che esegua il loop di tutti i record e calcoli lo sconto, ed eseguirlo una volta dopo l'aggiornamento alla nuova versione?
Qualche intuizione e suggerimento sono apprezzati. E fammi sapere o modificare se titolo e tag sono inappropriati o troppo vaghi.