微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法使用外键获取记录

如何解决无法使用外键获取记录

我正在制作一个网络应用程序,用户可以在其中创建播放列表和添加音乐(如 Spotify、Deezer 等)。但我无法在播放列表中获取音乐。这是我的播放列表和音乐课程:

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace Melodie.Models
{
    public class Playlist
    {
        [Key,Column("playlist_id")]
        public int? PlaylistId { get; set; }
        
        
        [required,Column("user_id")]
        public int? UserId { get; set; }
        
        
        [required,Column("color_id")]
        public int? ColorId { get; set; }
        
        
        [required,Column("name"),MaxLength(100)]
        public string Name { get; set; }
        
        
        [DataType(DataType.MultilineText),Column("Description"),MaxLength(255)]
        public string Description { get; set; }
        
        
        public List<Music> Musics { get; set; }

        public Playlist()
        {
            UserId = 1;
            ColorId = 1;
            Name = "Nouvelle playlist";
            //Musics = new List<Music>();
        }
    }
}
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.AspNetCore.Http;

namespace Melodie.Models
{
    public class Music
    {
        [Key,Column("music_id")]
        public int? MusicId { get; set; }
        
        
        [required,Column("playlist_id")]
        public int? PlaylistId { get; set; }
        //[ForeignKey("playlist_id")]
        //public virtual Playlist Playlist { get; set; }
        public Playlist Playlist { get; set; }
        
        
        [required,MaxLength(100)]
        public string Name { get; set; }
        
        
        [required,Column("file_path"),MaxLength(2048)]
        public string FilePath { get; set; }
        
        
        [NotMapped]
        public IFormFile MusicFile { get; set; }  
    }
}

我尝试遵循许多指南,包括 this one by Microsoft,但在加载显示页面时无法获得所有具有相同 PlaylistId 的音乐。我使用此功能检索我的播放列表数据:

public async Task<IEnumerable<Playlist>> GetPlaylistsOf(int userId)
{
    return await _db.Playlists
        .Where(p => p.UserId == userId)
        .Include(p => p.Musics)
        .OrderByDescending(p => p.PlaylistId)
        .ToListAsync();
}

我错过了什么?

解决方法

List<Musics> 集合实际上并未直接存储在您的数据库中。而是通过 playlistIduserId 查询播放列表中的所有音乐。

public async Task<IEnumerable<Music>> GetPlaylistsOf(int userId,int playlistId)
{
    return await _db.Musics
        .Include(p => p.Playlist)
        .Where(p => p.Playlist.UserId == userId)
        .OrderByDescending(p => p.PlaylistId)
        .ToListAsync();
}
,

我想你需要这个:

public Task<IEnumerable<Music>> GetUserMusic(int userId)
{
    return _db.Playlists
        .Where(p => p.UserId == userId)
        .SelectMany(p => p.Musics)
        .ToListAsync();
}
,

嗯,这个很愚蠢。

当我看到 Qudus 和 Svyatoslav Danyliv 的答案时,我意识到我一直在编辑函数 GetPlaylistsOf(int userId) 而不是 GetPlaylistById(int playlistId),它们完全不同。所以这现在工作得很好:

public async Task<Playlist> GetPlaylistById(int playlistId)
{
    return await _db.Playlists
        .Include(p => p.Musics)
        .FirstOrDefaultAsync(p => p.PlaylistId == playlistId);
}
        
public async Task<IEnumerable<Playlist>> GetPlaylistsOf(int userId)
{
    return await _db.Playlists
        .Where(p => p.UserId == userId)
        .OrderByDescending(p => p.PlaylistId)
        .ToListAsync();
}

谢谢你的帮助

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。