4
respostas

NHibernate não define FK como NOT NULL no SQL Server

Ao criar meu schema no SQL Server 2012, o NHibernate não define sozinho a FK CategoriaId como NOT NULL, possbilitando a inserção de valores NULL na coluna que é FK. Uma informação e uma dúvida:

Informação:

Aos colegas que, como eu, estiverem utilizando o SQL Server para o curso, vocês devem declarar o relacionamento many-to-one desta forma no Produto.hbm.xml:

Desta forma, utilizando o not-null="true", o NHibernate define a coluna como NOT NULL, e gera a exception ao tentar inserir um valor nulo nesta coluna, garantindo a integridade dos dados.

Dúvida:

O NHibernate só se comporta desta forma por alguma particularidade do SQL Server, e no MySQL ele sempre cria as FK como NOT NULL, ou o instrutor deixou passar esse detalhe na explicação?

Obrigado,

Lucas

4 respostas

Oi Lucas, é que o comportamento default pode ser not-null=false, não? não manjo de nhibernate, é só um chute mesmo

Mas se o comportamento default é not-null=false, o instrutor não deveria ter passado isso na aula?

Oi Lucas, não sei ao certo :). Como você está usando um orm, muitas vezes, a ideia é deixar a inteligência na aplicação mesmo... Vou tentar achar uma pessoa especializada para dar um suporte aqui.

Olá, Lucas

Se você criar um script (em T-SQL) para criar o esquema do banco de dados no SQL Server e não especificar que uma coluna com uma constraint FOREIGN KEY é NOT NULL, a coluna será nullable. Da mesma forma, se você criar o esquema via ORM (NHibernate, Entity Framework, etc.), na falta de uma indicação de uma atributo/configuração de que a coluna é NOT NULL, o ORM não irá fornecer essa informação ao DDL (Data Definition Language) do motor do banco de dados, logo o ORM irá gerar um script T-SQL que também irá criar uma coluna que permite nulos. Resumindo, na hora de gerar o esquema do banco de dados, o ORM não opina sobre o que ele não sabe, e como resultado o próprio motor do banco de dados é que irá decidir como criar as colunas. E pelo que vi o MySQL faz a mesma coisa (https://dev.mysql.com/doc/refman/5.7/en/create-table-foreign-keys.html). Então o fato de ser nullable é uma característica da própria coluna, e não tem a ver com com o fato de ela ter ou não uma constraint FOREIGN KEY associada. Coluna que não é explicitamente definida como NOT NULL aceitará nulos.