2017-10-20 170 views
0

我的类被设计这样的:获取财产的财产

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); 
    } 
} 

但我认为必须有一个更好的解决方案。你能帮助我吗?

回答

1

尝试更正您的班级申报(virtualICollection)。另外,还要确保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;} 
} 
0

如果您想选择特定的东西,你可以选择它们:

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回答的延迟加载。但是,如果您事先知道您需要播放列表,则不需要延迟加载,它只会创建不必要的中间查询。

如果您想加载视频列表,而您只想访问某些视频的播放列表,而不是大部分/全部视频,则延迟加载将是一种好方法。