Alterando a convenção de nomenclatura usada no Fluent NHibernate

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!

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Sharing Buttons by Linksku