如何在我的网站中加入数据库表?

Posted

技术标签:

【中文标题】如何在我的网站中加入数据库表?【英文标题】:How to join database tables in my website? 【发布时间】:2021-08-12 20:33:46 【问题描述】:

这是我的代码:

albums.cshtml

@page
@using Project.Models
@model Project.Pages.AlbumsModel
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

<div class="row">
    <h1 class="display-2">Albums</h1>
    <table class="table">
        <thead class="thead-inverse">
            <tr>
                <th>Album ID</th>
                <th>Artist ID</th>
                <th>Artist name</th>
                <th>Album title</th>
                <th></th>
                <th></th>
            </tr>
        </thead>

        <tbody>
            @foreach (Album album in Model.Albums)
            
                <tr>
                    <td>@album.AlbumId</td>
                    <td>@album.ArtistId</td>
                    <td>@html.DisplayFor(modelArtists => album.Artist.Name)</td>
                    <td>@album.Title</td>
                    <td><a asp-page="/Albums/Details" asp-route-id="@album.AlbumId">Details</a></td>
                    <td><a asp-page="/Albums/Edit" asp-route-id="@album.AlbumId">Edit</a></td>
                    <td><a asp-page="/Albums/Delete" asp-route-id="@album.AlbumId">Delete</a></td>   
                    <td><a asp-page="/Albums/AlbumTracks" asp-route-id="@album.AlbumId">Tracks</a></td>       
                </tr>
            
        </tbody>
    </table>
</div>
<div class="row">
    <p>Enter a title & ArtistID for a new album:&nbsp;</p>
    <form method="POST">
        <div><input asp-for="Album.Title" /></div>
        <div><input asp-for="Album.ArtistId" /></div>
        <input type="submit" />
    </form>
</div>
<div>
    <a asp-page="/Index">Home</a>
</div>

AlbumTracks.cshtml

@page
@using Project.Models
@model Project.Pages.AlbumTracksModel
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

<div class="row">
    <h1 class="display-2">Tracks</h1>
    <table class="table">
        <thead class="thead-inverse">
            <tr>
                <th>Track name</th>
                <th></th>
                <th></th>
                <th></th>
                <th></th>
            </tr>
        </thead>

        <tbody>
            @foreach (Track track in Model.Tracks)
            
                <tr>
                    <td>@track.TrackId</td>
                    <td>@track.Name</td>
                </tr>
            
        </tbody>
    </table>
</div>
@* <div class="row">
    <p>Enter a name & TrackID for a new track:&nbsp;</p>
    <form method="POST">
        <div><input asp-for="Track.Name" /></div>
        <div><input asp-for="Track.TrackId" /></div>
        <input type="submit" />
    </form>
</div> *@
<div>
    <a asp-page="/Index">Home</a>
</div>

AlbumTracks.cshtml.cs

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.EntityFrameworkCore;
using Project.Models;
using System;
using System.Collections.Generic;
using System.Linq;

namespace Project.Pages

    public class AlbumTracksModel : PageModel
    
        private Chinook db;

        public AlbumTracksModel(Chinook injectedContext)
        
            db = injectedContext;
        
        public IEnumerable<Track> Tracks  get; set; 
        public void OnGetAsync()
        
            ViewData["Title"] = "Chinook Web Site - Tracks";
            Tracks = db.Tracks.Include(a => a.Album);
        
    

目前,我在 AlbumTracks.cshtml 中显示每个专辑中的所有曲目,而不仅仅是用户在 album.cshtml 中选择的曲目。我已经反复阅读this,但我正在努力找出 AlbumTracks.cshtml 的语法,也许我需要在 AlbumTracks.cshtml.cs 中添加更多内容?

我想也许我需要使用这样的东西来加入表格:

        if (item.AlbumID == Model.AlbumID)

请指点一下? TIA。

编辑:GitHub repo

【问题讨论】:

【参考方案1】:

目前,我在 AlbumTracks.cshtml 中显示每张专辑的所有曲目,而不仅仅是用户在 album.cshtml 中选择的曲目。

你确定你描述的是正确的吗?您可以使用以下代码显示所有专辑中的所有曲目:

Tracks = db.Tracks.Include(a => a.Album);

我想你想要的是当你点击albums.cshtml中的Tracks链接时可以显示所选专辑的曲目:

<td><a asp-page="/Albums/Album Tracks" asp-route-id="@album.AlbumId">Tracks</a></td>

如果我说的是正确的,你需要先将id 参数添加到你的/Albums/AlbumTracks 方法并修改linq,如下所示:

public class AlbumTracksModel : PageModel

    private Chinook db;

    public AlbumTracksModel(Chinook injectedContext)
    
        db = injectedContext;
    
    public IEnumerable<Track> Tracks  get; set; 

    public void OnGetAsync(int id)
    
        ViewData["Title"] = "Chinook Web Site - Tracks";
        Tracks = db.Tracks.Include(a => a.Album).Where(a=>a.AlbumId==id);
    

专辑曲目.cshtml:

@page
@using Project.Models
@model Project.Pages.AlbumTracksModel
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

<div class="row">
    <h1 class="display-2">Tracks</h1>
    <table class="table">
        <thead class="thead-inverse">
            <tr>
                <th>Track name</th>
                <th></th>
                <th></th>
                <th></th>
                <th></th>
            </tr>
        </thead>

        <tbody>
            @foreach (Track track in Model.Tracks)
            
                <tr>
                    <td>@track.TrackId</td>
                    <td>@track.Name</td>
                </tr>
            
        </tbody>
    </table>
</div>

结果:

【讨论】:

谢谢,但这里有一件或多件事情我不太明白。 IDK 你的意思是'你确定你描述的是正确的吗? AlbumTracks.cshtml 页面明确显示了所有专辑中的所有曲目。我已经用Tracks = db.Tracks.Where(a=&gt;a.AlbumId == id).Include(a =&gt; a.Album); 更新了 AlbumTracks.cshtml.cs。那是表连接,对吗?但是现在如何让所选专辑的曲目列表实际显示在 AlbumTracks.cshtml 上?我不知道使用什么语法。 github.com/double-happ1ness/chinook 这是表连接。你是什​​么意思不知道使用什么语法?只需在后端使用 Tracks = db.Tracks.Where(a=&gt;a.AlbumId == id).Include(a =&gt; a.Album); 就足够了。而您的客户端使用:@foreach (Track track in Model.Tracks)Tracks 这里匹配后端Tracks。也就是说它将读取后端数据并将其显示在您的 AlbumTracks.cshtml 中。你在你的项目中尝试过吗? 我已经更新了 AlbumTracks.cshtml。其实它和你的一样。我想你可能没有时间在你的项目中测试我的代码。 啊,太棒了,非常感谢。我一开始并没有看到与Tracks = db.Tracks.Include(a =&gt; a.Album).Where(a=&gt;a.AlbumId==id); 的区别。我以为我的版本只是在做同样的事情,但由于某种原因,我不清楚它不是。再次感谢。【参考方案2】:

也许可以试试:

foreach (var track in Model.Tracks)

    if(item.AlbumID == Model.AlbumID)
    
         <tr>
              <td>@track.TrackId</td>
              <td>@track.Name</td>
         </tr> 
    

您可以发布您的模型吗?

我的应用中有类似的东西,我创建了 2 个模型,例如1 个用于曲目,1 个用于专辑。 然后在您的专辑模型中创建一个列表 Tracklist 并在您的轨道模型中创建一个属性 AlbumId。 在您的轨道控制器中,创建轨道后,您可以拥有类似

var albums = _context.Albums.toList // or any other way to retrieve the albums from the DB. 
foreach (var item in albums)
if (track.AlbumId = item.Id)

     item.Tracklist.add(Track)

我对此还是有点陌生​​,所以希望这可行!

【讨论】:

谢谢,但由于某种原因,这给了我错误“当前上下文中不存在名称 'track'”。当您说模型时,您是指实体文件吗?专辑.cs & Track.cs?还是上下文文件 Chinook.cs? 我又试了一次,但这次我得到'名称'item'在当前上下文中不存在'&''AlbumTracksModel'不包含'AlbumId'的定义并且没有可以找到接受“AlbumTracksModel”类型的第一个参数的可访问扩展方法“AlbumId”' 您能否发布一个指向您的 github 存储库或源代码的链接?我的意思是将Id添加到album.cs,将AlbumId添加到Track.cs。然后在包管理器控制台中执行:添加迁移和更新数据库。这会将列添加到您的数据库中,接下来清空您的数据库并用新的测试数据填充它,并通过将每个曲目的 AlbumId 设置为专辑的相应 ID 将曲目与其专辑链接,如果这有帮助,请告诉我 GitHub 存储库位于 github.com/double-happ1ness/chinook 。需要明确的是,AlbumId 已经作为 Album 表的主键和 Tracks 表的外键存在,所以我几乎完全可以肯定,不需要对数据库进行任何进一步的处理。现在我正在用Tracks = db.Tracks.Where(a=&gt;a.AlbumId == id).Include(a =&gt; a.Album); '提取'我需要的数据。我认为这是正确的,因为登录页面使用id 作为参数。但是,如何让曲目实际显示在 AlbumTracks.cshtml 页面上?

以上是关于如何在我的网站中加入数据库表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 symfony 5 中加入两个表?

如何在 laravel eloquent 中加入三个表?

如何在 App Script 中加入两个表并将数据提取到大查询现有表中

如何在 Spring Boot JPA 中加入两个表,我的代码出错了

如何在名称作为参数提供的用户定义函数中加入表?

如何在 pyspark 中加入带有熊猫数据框的配置单元表?