Pergunta

Atualmente, estou escrevendo uma aplicação financeira, e nós temos uma tabela de clientes bastante normal. Consiste em muitos campos obrigatórios e alguns opcionais como celular / etc Fax .. Eu estou usando NHibernate como ORM e ter todos os mapeamentos corretos. Ela já funciona.

Eu só quero saber, como faço para "expressar" no código que um campo não é nulo sem comentar? Tenho os arquivos hbm.xml que documentam isso, mas é meio estranho olhar para eles para coisas como esta.

A outra coisa que vem à mente é que eu não quero que o repositório para lançar exceções NHibernate na minha lógica, então talvez eu deveria ir a rota de validação na Controller. Ainda assim, como posso fazer o código POCO expressar que alguns campos pode ser nulo?

Diagrama de Classe

Como você pode ver, eu quero ter Celular e Fax ser quando Telefone opcional obrigatório. Eles são todos os mapeamentos apenas compostos, de modo que o arquivo de mapeamento apenas especifica que os elementos individuais de cada tem que ser não-nulo, mas eu odeio fazer o Person.Cellular! = Null verificar o tempo todo para evitar ter um NullReferenceException.

Foi útil?

Solução

Existem algumas maneiras de fazer isso dependendo do seu comportamento POCO e estilo de codificação. Em primeiro lugar, você pode usar tipos anuláveis ??para expressar que este campo é anulável e seria portanto implícito que o resto não são anulável. Alternativamente, você pode introduzir um tipo de valor Phone como o tipo para a propriedade Telefone do POCO você ilustrada, o que implica que, porque não é um tipo primitivo é "mais importante" - isso também permitirá que você validação de número de telefone encapsular dentro da classe em si.

Em minha mente, para ser um objeto POCO verdade, não precisa se preocupar com a condição de nulidade subjacente dentro da tabela de banco de dados é persited em ... ele realmente deve ter validação e valor tipos que expressam seu comportamento como uma entidade autônoma ; assim, antes que chegue ao NHibernate ele já está em um estado válido.

Outras dicas

Faça notnull propriedades somente leitura e escrita a eles através de um construtor público. Faça o construtor padrão protegido ou privado.

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;} 
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top