Questo in realtà non è specifico di Dapper, in quanto si riferisce a qualsiasi oggetto serializzabile XML .. ma si è verificato quando stavo memorizzando un oggetto usando Dapper.
In ogni caso, diciamo che ho una classe utente. Normalmente, farei qualcosa del genere:
class User
{
    public string SIN {get; private set;}
    public string DisplayName {get;set;}
    public User(string sin)
    {
        if (string.IsNullOrWhiteSpace(sin))
            throw new ArgumentException("SIN must be specified");
        this.SIN = sin;
    }
}
Dato che è richiesto un SIN, vorrei solo creare un costruttore con un parametro sin, e renderlo di sola lettura.
Tuttavia, con un Dapper (e probabilmente qualsiasi altro ORM), ho bisogno di fornire un costruttore senza parametri e rendere tutte le proprietà scrivibili. Quindi ora ho questo:
class User: IValidatableObject 
{
    public int Id { get; set; }
    public string SIN { get; set; }
    public string DisplayName { get; set; }
    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
      // implementation
    }
}
 Questo sembra .. non può davvero scegliere la parola, un cattivo odore? 
A) Sto permettendo di cambiare le proprietà che non dovrebbero essere cambiate mai dopo che un oggetto è stato creato (SIN, userid) 
B) Ora devo implementare IValidatableObject o qualcosa di simile per testare tali proprietà prima di aggiornarle in db.
Quindi come si fa a riguardo?