我的类是这样设计的:
public class Video {
public int Id {get; set;}
public string Title {get; set;}
public int PlaylistId {get; set;}
[ForeignKey("PlaylistId")]
public Playlist Playlist {get; set;}
}
public class Playlist {
public int Id {get; set;}
public string Description {get; set;}
public List<Video> Videos {get; set;}
public Playlist() {
Videos = new List<Video>();
}
}现在,让我们创建一些对象:
Video video = new Video();
video.Title = "Titanic";
Playlist playlist = new Playlist();
playlist.Description = "Best videos";
playlist.Videos.Add(video);
context.Playlists.Add(playlist);
context.SaveChanges();问题是我不能从我的数据库上下文中获取video.Playlist引用。当然,我可以添加一个获取所需属性的方法:
public static Playlist GetPlaylist(int videoId) {
using (var context = new DatabaseContext()) {
Video video = context.Videos.FirstOrDefault(x => x.Id == videoId);
return context.Playlists.FirstOrDefault(x => x.Id == video.PlaylistId);
}
}但我认为肯定有更好的解决方案。你能帮我吗?
发布于 2017-10-20 14:12:49
尝试更正您的类声明(virtual和ICollection)。还要确保context.Configuration.LazyLoadingEnabled = true;:
public class Video
{
public int Id {get; set;}
public string Title {get; set;}
public int PlaylistId {get; set;}
[ForeignKey("PlaylistId")]
public virtual Playlist Playlist {get; set;}
}
public class Playlist
{
public int Id {get; set;}
public string Description {get; set;}
public virtual ICollection<Video> Videos {get; set;}
}发布于 2017-10-20 14:20:20
如果你想选择特定的东西,你可以直接选择它们:
var playlist = context.Videos
.Where(x => x.Id == videoId)
.Select(x => x.Playlist)
.FirstOrDefault();还可以使用Include指定要加载的引用实体
var video = context.Videos
.Include(x => x.Playlist)
.FirstOrDefault(x => x.Id == videoId);
var playlist = video.Playlist;第三个选项是virtual和延迟加载,正如@SlavaUtesinov回答的那样。但是如果你事先知道你想要播放列表,就不需要延迟加载,它只会创建不必要的中间查询。
如果你想加载一个视频列表,并且你只想访问其中一些视频的播放列表,而不是大多数/所有视频,那么延迟加载将是一个很好的方法。
https://stackoverflow.com/questions/46840765
复制相似问题