[英]Using data from a table and foreign key table in single query
很难从标题中进行解释,希望此描述有助于解释情况。 我有一个音乐应用程序,用户可以在其中创建播放列表。 所以我建立了两个表。
一个称为Playlists
(列:PlaylistID,PlaylistName,CreatorID),另一个称为PlaylistSongs
(列:PlaylistSongID,PlaylistID和SongID)。 我在PlaylistID列之间有一个外键连接。
我可以从“ Playlist
表中提取播放列表名称,并正确显示。 我遇到的问题是弄清楚如何显示元数据,例如艺术家(Sasha Sloan ODESZA等),这些元数据可以从通过外键连接的PlaylistSongs
表的SongID中获取。
这是我现在所拥有的:
调节器
public ActionResult Playlists()
{
var model = new HomePlaylistViewModel();
model.Playlists = EntityDataAccess.GetFeaturedPlaylistsByCount(6);
return View(model);
}
模型:
public class HomePlaylistViewModel
{
public List<Playlist> Playlists { get; set; }
public List<PlaylistSong> PlaylistSongs { get; set; }
public List<Album> Albums { get; set; }
}
CSHTML:
<div class="playlists-container">
@foreach (var item in Model.Playlists)
{
<div class="playlist-album">
<div class="album-grad"></div>
<a href="#">
<h1>
@item.PlaylistName
</h1>
<div class="playlist-desc-container">
<h4 class="playlist-desc">Featuring: INSERT ARTIST NAMES HERE</h4>
<h4 class="playlist-creator"> Songs • Curated by
</h4>
</div>
<img src="https://ucarecdn.com/6d669906-60df-4f26-bf80-f11eef3bd019/-/format/jpeg/-/quality/lightest/" class="playlist-album-art">
</a>
<button class="ui button playlist-listen">LISTEN</button>
<button class="ui button playlist-collect"><i class="material-icons">playlist_add</i></button>
</div>
}
Playlist.cs
public partial class Playlist
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Playlist()
{
this.PlaylistSongs = new HashSet<PlaylistSong>();
}
public int PlaylistID { get; set; }
public string PlaylistName { get; set; }
public int CreatorID { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<PlaylistSong> PlaylistSongs { get; set; }
}
EntityDataAccess.cs
public static List<Playlist> GetFeaturedPlaylistsByCount(int count)
{
using (var Context = GetContext())
{
return Context.Playlists.Take(count).ToList();
}
}
因此,我基本上有一个具有此Playlist
信息的模型:
我需要使用每个唯一的PlaylistID
来访问PlaylistSongs
表中具有该PlaylistID
的歌曲,以便可以在屏幕上显示。 那有意义吗?
编辑:添加了对上下文和相应类的调用
public static UnearthEntities GetContext()
{
var context = new UnearthEntities();
context.Configuration.ProxyCreationEnabled = false;
return context;
}
挖掘实体:
public partial class UnearthEntities : DbContext
{
public UnearthEntities()
: base("name=UnearthEntities")
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
public virtual DbSet<AccountInfo> AccountInfoes { get; set; }
public virtual DbSet<Album> Albums { get; set; }
public virtual DbSet<AlbumTag> AlbumTags { get; set; }
public virtual DbSet<AspNetRole> AspNetRoles { get; set; }
public virtual DbSet<AspNetUserClaim> AspNetUserClaims { get; set; }
public virtual DbSet<AspNetUserLogin> AspNetUserLogins { get; set; }
public virtual DbSet<AspNetUser> AspNetUsers { get; set; }
public virtual DbSet<DownloadHistory> DownloadHistories { get; set; }
public virtual DbSet<Song> Songs { get; set; }
public virtual DbSet<Spotlight> Spotlights { get; set; }
public virtual DbSet<Video> Videos { get; set; }
public virtual DbSet<FeaturedAlbum> FeaturedAlbums { get; set; }
public virtual DbSet<Key> Keys { get; set; }
public virtual DbSet<SongPlayDaily> SongPlayDailies { get; set; }
public virtual DbSet<Favorite> Favorites { get; set; }
public virtual DbSet<License> Licenses { get; set; }
public virtual DbSet<Product> Products { get; set; }
public virtual DbSet<Playlist> Playlists { get; set; }
public virtual DbSet<PlaylistSong> PlaylistSongs { get; set; }
}
请参阅Microsoft的文章: 实体框架加载相关实体
假设您的数据上下文正确,请使用Include
引入相关数据,例如:
return Context.Playlists.Include("PlaylistSongs").Take(count).ToList();
顺便说一句:为清楚起见,我将重命名您的某些字段。 例如,主键(PK)字段名称不必以表名作为前缀。 令人困惑。 只需将您的PK字段命名为“ Id”即可。 从相关表中引用键字段时,请使用表名。 例如,要在播放列表和播放列表歌曲之间建立一对多关系,表PlaylistSongs中将存在一个名为PlaylistId的字段。
关于模型的构建,请查看Microsoft的文档“ 创建模型和外键约束” 。 第一个提供了到示例代码的github回购的链接。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.