Saltar al contenido

Trabajar con vistas SQL en Entity Framework Core

Tenemos el arreglo a esta inconveniente, al menos eso pensamos. Si sigues con dudas coméntalo y sin dudarlo te ayudaremos

Solución:

En Entity Framework Núcleo 2.1 podemos usar tipos de consulta como sugirió Yuriy N.

Puede encontrar un artículo más detallado sobre cómo usarlos aquí.

El enfoque más directo según los ejemplos del artículo sería:

1.Tenemos por ejemplo los siguientes Modelos de entidad para gestionar publicaciones

public class Magazine

  public int MagazineId  get; set; 
  public string Name  get; set; 
  public string Publisher  get; set; 
  public List
Articles get; set; public class Article public int ArticleId get; set; public string Title get; set; public int MagazineId get; set; public DateTime PublishDate get; set; public Author Author get; set; public int AuthorId get; set; public class Author public int AuthorId get; set; public string Name get; set; public List
Articles get; set;

2. Tenemos una vista llamada AuthorArticleCounts, definida para devolver el nombre y el número de artículos que ha escrito un autor.

SELECT
  a.AuthorName,
  Count(r.ArticleId) as ArticleCount
from Authors a
  JOIN Articles r on r.AuthorId = a.AuthorId
GROUP BY a.AuthorName

3.Vamos y creamos un modelo para usar en la Vista

public class AuthorArticleCount

  public string AuthorName  get; private set; 
  public int ArticleCount  get; private set; 

4. Luego creamos una propiedad DbQuery en mi DbContext para consumir los resultados de la vista dentro del Modelo

public DbQuery AuthorArticleCountsget;set;

4.1. Es posible que deba anular OnModelCreating() y configurar la Vista, especialmente si tiene un nombre de vista diferente al de su Clase.

protected override void OnModelCreating(ModelBuilder modelBuilder)

    modelBuilder.Query().ToView("AuthorArticleCount");

5. Finalmente, podemos obtener fácilmente los resultados de la Vista de esta manera.

var results=_context.AuthorArticleCounts.ToList();

ACTUALIZAR
Según el comentario de ssougnez

Vale la pena señalar que DbQuery ya no será compatible con EF Core 3.0. Mira aquí

Las vistas actualmente no son compatibles con Entity Framework Core. Consulte https://github.com/aspnet/EntityFramework/issues/827.

Dicho esto, puede engañar a EF para que use una vista asignando su entidad a la vista como si fuera una tabla. Este enfoque viene con limitaciones. por ejemplo, no puede usar migraciones, necesita especificar manualmente un key para que lo use EF, y es posible que algunas consultas no funcionen correctamente. Para evitar esta última parte, puede escribir consultas SQL a mano

context.Images.FromSql("SELECT * FROM dbo.ImageView")

EF Core no crea DBset para las vistas SQL automáticamente en la llamada de contexto, podemos agregarlos manualmente como se muestra a continuación.

public partial class LocalDBContext : DbContext
 

    public LocalDBContext(DbContextOptions options) : base(options)
    

    

    public virtual DbSet YourView  get; set; 

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    
        modelBuilder.Entity(entity => 
            entity.HasKey(e => e.ID);
            entity.ToTable("YourView");
            entity.Property(e => e.Name).HasMaxLength(50);
        );
    


La vista de muestra se define a continuación con pocas propiedades.

using System;
using System.Collections.Generic;

namespace Project.Entities

    public partial class YourView
    
        public string Name  get; set; 
        public int ID  get; set; 
    

Después de agregar una clase para la vista y el conjunto de bases de datos en la clase de contexto, puede usar el objeto de vista a través de su objeto de contexto en el controlador.

Reseñas y puntuaciones

Al final de todo puedes encontrar las acotaciones de otros creadores, tú todavía puedes insertar el tuyo si te apetece.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *