Pesquisar

Fluent NNhibernate e Auto Mapping

Com o Fluent Nhibernate é possivel utilizar-se do padrão “Convention over Configuration”, Convençao sobre Configuração, quem é programador Java, ou de outras linguagens de script já usam bastante deste padrão, mas para .Net isto não é tão comum assim. Este padrão permite que não precisamos configurar nosso mapeamento, pois ele está implicito na declaração de nossas classes, possibilitado pela convençao. Por exemplo quando criamos um campo Id em nossa classe não necessitamos mapear essa propriedade, pois a convenção nos diz q ele vai ser uma chave primaria de nossa tabela.
O Fluent Nhibernate permite que seja mapeado as classe através dessa convenção, devemos apenas dizer quais as nossas classes devem ser mapeadas.
var mapeamento = AutoMap.AssemblyOf<Dominio.Entidades.Core.Usuario>(convencoes); //Qual assembly deve ser mapeado

var cfgFluent = FluentNHibernate.Cfg.Fluently.Configure(cfg).Mappings(x =>
x.AutoMappings.Add(mapeamento));

cfg = cfgFluent.BuildConfiguration();
this.FabricaSessao = BuildSessionFactory(cfg);

No caso acima passamos o assembly da classe Usuario, fazendo com que todas as outras classes sejam mapeadas.

public class Usuario : IEntidade
{
public virtual long Id { get; set; }

public virtual string Nome { get; set; }
}

A classe Usuário será mapeada para um tabela, onde o Id será a chave primária, e  o campo Nome será um varchar.

Porém necessitamos fazer alguns refinamentos nesses mapeamentos, por exemplo caso queiramos adicionar um prefixo no nome da tabela, ou por exemplo definir o tamanho do campo Nome no banco? Teremos que adicionar os mapeamentos um a um?  Ai entra a possibilidade de extensão do Fluent, todas as convençoes podem ser implementadas manualmente extendendo as convenções padrões.

public class TableNameConvention : IClassConvention
{
public void Apply(IClassInstance instance)
{
instance.Table("tb_" + instance.EntityType.Name);
}
}


Neste exemplo criamos uma convenção para o nome da tabela que será gerado, implementamos o IClassConvention, e setamos o nome da tabela que queremos. Todas as interfaces que podem ser implementadas estão no namespace using FluentNHibernate.Conventions.

Na hora de configurar o Fluent devemos adicionar nossas convenções antes de criar a SessionFactory.

var mapeamento = AutoMap.AssemblyOf<Dominio.Entidades.Core.Usuario>(convencoes); //Qual assembly deve ser mapeado
mapeamento.Conventions.Add<TableNameConvention>();
mapeamento.Conventions.Add<PrimaryKeyNameConvention>();

var cfgFluent = FluentNHibernate.Cfg.Fluently.Configure(cfg).Mappings(x =>
x.AutoMappings.Add(mapeamento));

Desta forma o Fluent saberá que deverá usar nossas classes de configuração.

Essa apenas uma das maneiras que o Fluent permite fazer, temos outras mais em exemplos por ai na internet. Vale a pena dar uma olhada e verificar qual melhor se aplica ao seu projeto. Isso é muito util no caso de você já ter algumas convenções que usa e não quer mudar e para código legado.

Nenhum comentário: