获取财产的财产
问题描述:
我的类被设计这样的:获取财产的财产
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);
}
}
但我认为必须有一个更好的解决方案。你能帮助我吗?
答
尝试更正您的班级申报(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;}
}
答
如果您想选择特定的东西,你可以选择它们:
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回答的延迟加载。但是,如果您事先知道您需要播放列表,则不需要延迟加载,它只会创建不必要的中间查询。
如果您想加载视频列表,而您只想访问某些视频的播放列表,而不是大部分/全部视频,则延迟加载将是一种好方法。