Fluent API ou Annotation, Quem tem mais moral?

6 minuto(s) de leitura - February 20, 2018

01

Fala pessoal, tudo bem?! 💚

Dica EF Core

Esses dias estava conversando com alguém e me fez uma pergunta sobre Annotation (no que se refere aos atributos), pois bem resolvi colocar aqui um pequeno exemplo de como mostrar isso em prática e falar que as implementações por FluentAPI sempre anularão as configurações feitas por Annotations(Atributos).


Vamos pegar o seguinte cenário para fazer essa pequena demonstração.

Nossa Classe

[Table("TabelaAnotacao")]
public class Entidade
{
    public int Id { get; set; }

    [Column("DescricaoAnotacao")]
    public string Descricao { get; set; }

    [Column("DataAnotacao")]
    public DateTime Data { get; set; }
}

Nosso DBContext

public class ExemploContext : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(@"Data Source=.\Sistemas;Initial Catalog=ExemploConfiguracao;Integrated Security=True");
        optionsBuilder.UseLoggerFactory(new LoggerFactory().AddConsole());
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Entidade>(p =>
        {
            p.Property(x => x.Descricao).HasColumnName("DescricaoFluentAPI");
            p.Property(x => x.Data).HasColumnName("DataFluentAPI");
            p.ToTable("TabelaFluentAPI");
        });
    }
}

Nosso Programs.cs

class Program
{
    static void Main(string[] args)
    {
        using(var db = new ExemploContext())
        {
            db.Database.EnsureCreated();
            db.Set<Entidade>().Where(p => p.Descricao.Length > 0).ToList();
        }
    }
}


O que temos?

Bem criamos uma classe chamada Entidade onde contém nossas propriedades com anotações(Atributos), também criei nosso DbContext onde fiz as configurações no OnModelCreating com Fluent API, feito isso vamos ver os resultados pós execução do programa.

Saída SQL criação da tabela

CREATE TABLE [TabelaFluentAPI] (
    [Id] int NOT NULL IDENTITY,
    [DataFluentAPI] datetime2 NOT NULL,
    [DescricaoFluentAPI] nvarchar(max) NULL,
    CONSTRAINT [PK_TabelaFluentAPI] PRIMARY KEY ([Id])
);


Saída SQL do SELECT feito pelo EF CORE

SELECT [p].[Id], [p].[DataFluentAPI], [p].[DescricaoFluentAPI]
      FROM [TabelaFluentAPI] AS [p]
      WHERE CAST(LEN([p].[DescricaoFluentAPI]) AS int) > 0


Bom aqui já fica nítido que o EF Core sobrescreve as configurações feitas por anotações, dando a prioridade as configurações feita por Fluent API.

Então o que fazer?

Pois bem, a utilização do Flent API é sem dúvidas a melhor solução para utilizarmos, ué só por que sobrescreve as anotações?! Não, não por isso, é por que é muito mais completa, nos permite a extrair o máximo do EF Core, além de poder fazer configurações que são impossíveis com o uso do (Annotations).

Minha dica é: Use sempre que possível Fluent API em suas aplicações!

Pessoal, fico por aqui #dica!

Deixe um comentário