Bom dia, Thiago. Tudo bom?
1) O arquivo .hbm.xml não é um arquivo de código compilável. Se mudamos sua BuildAction para Embedded Resource, o NHibernate saberá sempre como acessar este arquivo sem a necessidade de outras configurações adicionais.
Em produção, seu mapeamento será diferente? Muito possivelmente não! No mais, tornar o mapeamento diferente nos ambientes de produção/desenvolvimento/homologação é sinal de que você terá problemas com o projeto. Tornando a Build Action como Embedded Resource faz sentido porque o mapeamento não será alterado após você subir um pacote para produção - de qualquer modo, você pode configurar como Copy to output directory e fazer alterações no código para o NHibernate ler este arquivo do disco, em tempo de execução.
O arquivo de configuração cfg.xml, como o próprio nome diz, é de configuração! Então, de acordo com o ambiente de execução (seus clientes e seus ambientes de dev/homolog) as configurações, como a de driver, por exemplo, poderão ser diferentes! Então é bastante valioso manter isto fora da nossa DLL para que o pessoal de infra/operação possa alterar.
2) Em documentos XML, o atributo xmlns
indica qual é o namespace a ser usado pelo documento. No caso, o namespace usado pelo documento é o urn:nhibernate-mapping-2.2
. Um namespace XML pode ser definido tanto com uma URL (por exemplo, http://www.w3.org/1999/xhtml
) quanto por uma URN. A URN é interessante quando você não pode oferecer uma URL acessível pela internet com a documentação à respeito do namespace.
Quando usamos um namespace, o leitor do documento XML sabe onde encontrar a especificação dos atributos e dos elementos do arquivo. Então hibernate-mapping
, class
, property
, etc. não são elementos aleatórios! São todos elementos definidos dentro do namespace urn:nhibernate-mapping-2.2
!
Outra forma de usar estes elementos é declarando um nome à este namespace como, por exemplo, com o atributo xmlns:meu_prefixo="urn:nhibernate-mapping-2.2"
Mas, perceba que agora não dizemos qual é o namespace do documento e sim qual é o namespace do prefixo meu_prefixo e, para usar estes elementos, precisaremos montar o XML com tags como:
<meu_prefixo:hibernate-mapping xmlns:meu_prefixo="urn:nhibernate-mapping-2.2">
<meu_prefixo:class name="Usuario">
</meu_prefixo:class>
</meu_prefixo:hibernate-mapping>
A versão da especificação usada no NHibernate atualmente é a 2.2 e você pode usar esta versão com segurança - versões de especificação são bem estáveis. Você saberá se houver uma nova especificação através do blog do NHibernate e, mesmo com uma nova versão, o código criado para o 2.2 continuará válido.
Tudo bem? Esclareci sua dúvida?