Domanda

Attualmente sto scrivendo un'applicazione finanziaria e abbiamo una tabella clienti piuttosto standard. È composto da molti campi obbligatori e alcuni facoltativi come Cell / Fax ecc. Sto usando NHibernate come ORM e ho tutte le mappature giuste. Funziona già.

Mi chiedo solo, come posso " esprimere " nel codice che un campo non è nullo senza commentare? Ho i file hbm.xml che documentano questo, ma è un po 'strano guardarli per cose come questa.

L'altra cosa che mi viene in mente è che non voglio che il repository generi eccezioni NHibernate nella mia logica, quindi forse dovrei seguire il percorso di convalida nel controller. Tuttavia, come posso esprimere il codice POCO in modo che alcuni campi possano essere nulli?

Diagramma di classe

Come puoi vedere, voglio che Cellulare e Fax siano opzionali mentre il Telefono è obbligatorio. Sono tutti solo mapping compositi, quindi il file di mapping specifica solo che i singoli elementi di ciascuno devono essere non nulli, ma odio fare il controllo Person.Cellular! = Null tutto il tempo per evitare di avere una NullReferenceException.

È stato utile?

Soluzione

Esistono alcuni modi per farlo a seconda del comportamento del POCO e dello stile di codifica. In primo luogo, è possibile utilizzare tipi nullable per esprimere che questo campo è nullable e sarebbe quindi implicito che il resto non sia nullable. In alternativa, potresti introdurre un tipo di valore Telefono come tipo per la proprietà Telefono del POCO che hai illustrato, implicando che, poiché non è un tipo primitivo, è "più importante" - ciò consentirebbe anche di incapsulare la convalida del numero di telefono all'interno della classe stessa.

Nella mia mente, per essere un vero oggetto POCO, non è necessario preoccuparsi della nullità sottostante nella tabella del database in cui è perseguito ... dovrebbe effettivamente avere tipi di validazione e valore che esprimono il suo comportamento come entità autonoma ; quindi prima che arrivi a NHibernate è già in uno stato valido.

Altri suggerimenti

Crea proprietà notnull in sola lettura e scrivile tramite un costruttore pubblico. Rendi il costruttore predefinito protetto o privato.

public class DomainObject{
private string nnp;
protected DomainObject(){}
public DomainObject(string nnp){
this.nnp = nnp;
}
public string NotNullProp {get {return nnp;}}
public string NullableProp {get;set;} 
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top