Sto usando EF Code First e ho avuto un modello come sotto.
public class Account
{
[Required]
public string AccountNo { get; set; }
[Required]
public decimal Balance { get; set; }
}
Ho utilizzato una classe di servizio per prelevare e depositare l'importo sul conto. Poi mi sono imbattuto in questo e ho realizzato che Account è anemico. Così ho felicemente aggiunto Prelevare e Depositare metodi su Account.
public class Account
{
[Required]
public string AccountNo { get; set; }
[Required]
public decimal Balance { get; set; }
public void Withdraw(decimal amount)
{
// TODO: Check if enough balance is available
Balance -= amount;
}
public void Deposit(decimal amount)
{
Balance += amount;
}
}
Sono stato molto contento di questo fino a quando ho realizzato che questo non implementa correttamente l'incapsulamento. Non dovresti essere in grado di modificare direttamente il Saldo - dovresti usare metodi di prelievo e deposito. Ma nella mia soluzione puoi modificare direttamente la Balance.
Ma non posso rendere Balance una proprietà readonly poiché sto utilizzando il primo approccio al codice EF e le proprietà readonly non determineranno la creazione della colonna nella tabella del database.
Ho pensato di lasciare Account anemico e creare una classe di account di livello superiore che implementa metodi di incapsulamento e prelievo / deposito. Ma in quel caso la classe di livello superiore non avrebbe annotazioni di dati di convalida e non otterrò la funzionalità gratuita fornita dal framework.
Qual è la soluzione?