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.
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.
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.
Id | PrimeiroNome | UltimoNome | QuantidadeFilmes |
---|---|---|---|
23 | SANDRA | KILMER | 37 |
37 | VAL | BOLGER | 35 |
13 | UMA | WOOD | 35 |
26 | RIP | CRAWFORD | 33 |
27 | JULIA | MCQUEEN | 33 |
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!