web-dev-qa-db-fra.com

Utilisation de vues SQL dans Entity Framework Core

Par exemple, j'ai un tel modèle:

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public BlogImage BlogImage { get; set; }
}

public class BlogImage
{
    public int BlogImageId { get; set; }
    public byte[] Image { get; set; }
    public string Caption { get; set; }

    public int BlogId { get; set; }
    public Blog Blog { get; set; }
} 

Je veux retourner dans ImageView view rl et Image.

Où dois-je créer et définir cette vue SQL?

37
Yurii N.

Dans Entity Framework Core 2.1 , nous pouvons utiliser types de requête comme suggéré par Yuriy N.

Vous trouverez un article plus détaillé sur leur utilisation ici

Selon les exemples de l'article, l'approche la plus simple consiste à:

1.Nous avons par exemple l'entité suivante Modèles pour gérer les publications

public class Magazine
{
  public int MagazineId { get; set; }
  public string Name { get; set; }
  public string Publisher { get; set; }
  public List<Article> 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<Article> Articles { get; set; }
}

2.Nous avons une vue appelée AuthorArticleCounts, définie pour renvoyer le nom et le nombre d'articles qu'un auteur a écrits.

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

3.Nous allons créer un modèle à utiliser pour la vue

public class AuthorArticleCount
{
  public string AuthorName { get; private set; }
  public int ArticleCount { get; private set; }
}

4.Nous créons ensuite une propriété DbQuery dans mon DbContext pour utiliser les résultats de vue dans le modèle.

public DbQuery<AuthorArticleCount> AuthorArticleCounts{get;set;}

5.Enfin, nous pouvons facilement obtenir les résultats de la vue comme ceci.

var results=_context.AuthorArticleCounts.ToList();
44

Les vues ne sont actuellement pas prises en charge par Entity Framework Core. Voir https://github.com/aspnet/EntityFramework/issues/827 .

Cela dit, vous pouvez inciter EF à utiliser une vue en mappant votre entité sur la vue comme s'il s'agissait d'une table. Cette approche vient avec des limites. par exemple. vous ne pouvez pas utiliser les migrations, vous devez spécifier manuellement une clé pour EF, et certaines requêtes risquent de ne pas fonctionner correctement. Pour contourner cette dernière partie, vous pouvez écrire des requêtes SQL à la main

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

Voici une nouvelle façon de travailler avec les vues SQL dans EF Core: Types de requête .

13
Yurii N.

L'EF Core ne crée pas automatiquement de DBset pour les vues SQL dans les cals de contexte, nous pouvons les ajouter manuellement comme indiqué ci-dessous.

public partial class LocalDBContext : DbContext
{ 

    public LocalDBContext(DbContextOptions<LocalDBContext> options) : base(options)
    {

    }

    public virtual DbSet<YourView> YourView { get; set; }

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

}

La vue exemple est définie ci-dessous avec quelques propriétés

using System;
using System.Collections.Generic;

namespace Project.Entities
{
    public partial class YourView
    {
        public string Name { get; set; }
        public int ID { get; set; }
    }
}

Après avoir ajouté une classe pour la vue et la base de données définies dans la classe de contexte, il est conseillé d'utiliser l'objet de vue via votre objet de contexte dans le contrôleur.

11

QueryTypes est la réponse canonique de EF Core 2.1, mais j’ai utilisé une autre façon lors de la migration depuis une première approche de base de données (la vue est déjà créée dans la base de données):

  • définissez le modèle pour qu'il corresponde aux colonnes de la vue (faites correspondre le nom de la classe du modèle au nom de la vue ou utilisez l'attribut Table. Assurez-vous que l'attribut [Key] est appliqué à au moins une colonne, sinon l'extraction de données échouera
  • ajouter DbSet dans votre contexte
  • ajouter une migration (Add-Migration)
  • supprime ou commente le code pour la création/suppression de la "table" à créer/supprimer en fonction du modèle fourni
  • mise à jour de la base de données (Update-Database)
1
Alexei