Recentemente iniciei um projeto na qual decidi utilizar o NHibernate 3.0 e testar o Linq to NHibernate. Posso dizer que estou muito satisfeito com o resultado desta versão e até agora consegui escrever todas as minhas queries usando Linq. Além disso, resolvi também utilizar o Fluent NHibernate já que, das 3 opções que temos, é a que mais me agrada.
Para quem me conhece sabe que eu extremamente chato quanto a nomenclatura de classes, variáveis, tabelas, pacotes etc. Nem sempre consigo achar um nome legal, as vezes demora, por isso prefiro colocar um nome temporário e deixar para melhorar em uma próxima refatoração.
Foi exatamente isso que aconteceu quando comecei a utilizar o Fluent NHibernate (FH) e foi o que me levou a escrever este post. Por padrão, sempre que temos uma relação ManyToMany, como por exemplo Usuário e Grupo, o FH cria uma tabela intermediária e esta recebe o nome de UsuarioToGrupo, ou seja, ela segue o padrão {Tabela1}To{Tabela2}. Muitos de vocês devem ter suas próprias convenções para nomear tabelas, por exemplo nunca utilizar nomes no plural ( eu uso bastante esta ) e também utilizar um underline nas tabelas com relacionamento N-N. Seguindo este padrão, o resultado da tabela seria Usuario_Grupo, na qual eu acho mais legível e limpo.
Caso você tambem goste deste formato e deseja utilizá-lo no Fluent NHibernate, crie uma nova classe que extenda ManyToManyTableNameConvention e faça uma sobrescrita dos métodos GetBiDirectionalTableName e GetUniDirectionalTableName conforme o exemplo abaixo.
public class BetterManyToManyTableNameConvention : ManyToManyTableNameConvention
{
protected override string GetBiDirectionalTableName(IManyToManyCollectionInspector collection, IManyToManyCollectionInspector otherSide)
{
return collection.EntityType.Name + "_" + otherSide.EntityType.Name;
}
protected override string GetUniDirectionalTableName(IManyToManyCollectionInspector collection)
{
return collection.EntityType.Name + "_" + collection.ChildType.Name;
}
}
Work complete! Essa foi fácil ein? Adoro frameworks extensíveis :)
Não se esqueça de registrar esta customização ao criar a SessionFactory, se você não sabe como fazer isso, estou colando abaixo um exemplo.
ISessionFactory factory = Fluently.Configure().Database(
MsSqlConfiguration.MsSql2008.ConnectionString("MY SECRET CONN STRING").Mappings(
x =>
{
x.FluentMappings.AddFromAssemblyOf<User>();
x.FluentMappings.Conventions.Add<BetterManyToManyTableNameConvention>();
}
).BuildSessionFactory();
Vale lembra também que este é apenas um exemplo de customização, para maiores opções basta consultar a namespace “FluentNHibernate.Conventions” e procurar a interface ou classe de seu interesse.
Até mais!




