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