Fluent API ou Annotation, Quem tem mais moral?

6 minuto(s) de leitura

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!

Categorias:

Atualizado em:

Deixe um comentƔrio