2
respostas

Já existe mais suporte a views no EF Core

A partir do Entity Framework Core 3.1 já é possível usarmos entidades para representar views. Documentação da Microsoft: Engenharia reversa de exibições de banco de dados.

2 respostas

Implementando a Melhoria

Adicionei uma migração vazia, e alterei ela para executar um SQL e criar no banco de dados de teste a view do banco de dados legado.

public partial class MigracaoAtoresMaisAtuantes : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.Sql(@"
        CREATE VIEW [top5_most_starred_actors]
        AS
            select top 5 a.actor_id, a.first_name, a.last_name, count(fa.film_id) as total
            from actor a
            inner join film_actor fa on fa.actor_id = a.actor_id
            group by a.actor_id, a.first_name, a.last_name
            order by total desc");
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.Sql(@"DROP VIEW [top5_most_starred_actors]");
    }
}

Criei uma classe/registro para representar a entidade.

public record AtorMaisAtuante(int Id, string PrimeiroNome, string UltimoNome, int QuantidadeFilmes);

Mapeei a view em nosso contexto.

public class AluraFilmesContext : DbContext
{
        public DbSet<AtorMaisAtuante> AtoresMaisAtuantes { get; set; } = default!;

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<AtorMaisAtuante>(entity =>
            {
            entity.HasNoKey();

            entity.ToView("top5_most_starred_actors");

            entity.Property(e => e.Id).HasColumnName("actor_id");

            entity.Property(e => e.PrimeiroNome)
            .HasMaxLength(45)
            .IsUnicode(false)
            .HasColumnName("first_name");

            entity.Property(e => e.UltimoNome)
            .HasMaxLength(45)
            .IsUnicode(false)
            .HasColumnName("last_name");

            entity.Property(e => e.QuantidadeFilmes).HasColumnName("total");
        });
    }
}

Executei uma consulta em uma aplicação console.

using AluraFilmesContext context = new();

foreach (AtorMaisAtuante ator in context.AtoresMaisAtuantes)
{
    Console.WriteLine(ator);
}

E como resultado, foi impresso no console o mesmo resultado da aula.

IdPrimeiroNomeUltimoNomeQuantidadeFilmes
23SANDRAKILMER37
37VALBOLGER35
13UMAWOOD35
26RIPCRAWFORD33
27JULIAMCQUEEN33

Olá, Bruno

A partir do Entity Framework Core 3.1, já é possível utilizar entidades para representar views. Isso é muito útil quando precisamos utilizar views existentes em um banco de dados legado.

No caso do seu exemplo, você pode utilizar o método FromSql para empregar a view dbo.top5_most_starred_actors no seu código. Basta substituir o SQL presente no Program.cs pelo seguinte trecho:

contexto.LogSQLToConsole();

var sql = @"select a.* from actor a
    inner join top5_most_starred_actors filmes on filmes.actor_id = a.actor_id";

Dessa forma, você estará utilizando a view no seu código e poderá compartilhar o select em outros locais da aplicação.

É importante ressaltar que o uso de views ainda não é suportado nativamente pelo EF Core, mas é possível contornar essa limitação utilizando o FromSql.

Espero ter ajudado! Bons estudos!