2 votes

EF Core : Comment interroger une vue SQL

J'ai une vue SQL dans ma base de données appelée 'dbo.Viewtest'. Cette vue combine les données de 2 autres tables, qui ont des types de colonnes identiques. La vue ajoute également une colonne indiquant la table d'où proviennent les données.

Voici à quoi ressemble la vue SQL dans l'explorateur d'objets de SQL Server :

dbo.ViewTest

Id | Type | Contenu | Emplacement

1 | h1 | Bienvenue!| Accueil

2 | p | Connexion | Accueil

3 | h2 | guide | Accueil

1 | h1 | info | Événements

2 | p | suivre | Événements

Cette vue est créée à partir de deux tables, dont l'une est appelée "HomeContent" et l'autre "EventsContent" (d'où la colonne de l'emplacement). La vue a été créée à l'aide du code suivant :

protected override void Up(MigrationBuilder migrationBuilder)
        {
            migrationBuilder.Sql("CREATE VIEW ViewTest AS " +
                "SELECT Id, Type, Content, 'Home' location FROM HomeContent UNION ALL " +
                "SELECT Id, Type, Content, 'Evenementen' FROM EvenementenContent");

        }

J'ai ensuite ajouté une classe de modèle comme suit :

  [Table("ViewTest")]
    public class TestViewContent
    {
        [Key]
        public int Id { get; set; }
        public string Type { get; set; }
        public string Content { get; set; }
        public string Location { get; set; }
    }

Enfin, je l'ai ajouté à mon DbContext :

 public DbSet<TestViewContent> TestViewContent { get; set; }

C'est ici que les choses commencent à se gâter. Lorsque j'essaie d'afficher cette vue SQL, en utilisant EF Core, j'obtiens le résultat suivant :

Id | Type | Contenu | Emplacement

1 | h1 | Bienvenue!| Accueil

2 | p | Connexion | Accueil

3 | h2 | guide | Accueil

1 | h1 | Bienvenue | Accueil

2 | p | log in | Home

Comme vous pouvez le voir, pour une raison quelconque, lorsque j'essaie d'afficher la vue SQL, les données "tournent en boucle" alors que les données de la table "Événements" sont censées s'afficher. Ainsi, pour une raison quelconque, seules les données de la table "Home" sont affichées.

Le code que j'utilise pour afficher la vue SQL est le suivant :

 private readonly DbApplicationContext_context;

        public TestViewContentController(DbApplicationContext_context)
        {
            _context = context;
        }

   public async Task<IActionResult> Index()
        {
            return View(await _context.TestViewContent.ToListAsync());
        }

Quelqu'un pourrait-il m'aider ? Au cas où il ne serait pas possible d'afficher des vues SQL, quelqu'un connaît-il un meilleur moyen de combiner plusieurs tables et d'ajouter une colonne "Emplacement" pour retracer la table d'où proviennent les données ? Toute aide serait grandement appréciée !

5voto

Peter B Points 69

Cela se produit parce que vous mettez [Key] sur le Id mais votre VIEW produit des valeurs en double dans le Id lors de la combinaison des deux tableaux. EF Core se dit alors probablement "Ah, il y a Id =1 again, I have that row already, so I will reuse it".

Il y a trois solutions possibles :

(1) Définir une clé primaire distincte pour la VIEW qui est garantie de générer des valeurs uniques et de l'utiliser dans EF Core en tant que [Key] .

ou

(2) Conservez la VIEW telle qu'elle est, puis, dans EF Core, définissez une clé primaire composite . Notez que EF Core ne prend pas en charge la création d'une clé composite à l'aide de la fonction [Key] vous devez utiliser l'API Fluent HasKey() fonction , en l'occurrence pour le Location y Id propriétés.

ou

(3) Ne pas tenir compte de la [Key] au total, il se peut que vous n'en ayez pas besoin, comme cela est décrit dans les documents ici : Types d'entités sans clé .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X