首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取属性的属性

获取属性的属性
EN

Stack Overflow用户
提问于 2017-10-20 08:30:51
回答 2查看 58关注 0票数 0

我的类是这样设计的:

代码语言:javascript
复制
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>();
    }
}

现在,让我们创建一些对象:

代码语言:javascript
复制
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引用。当然,我可以添加一个获取所需属性的方法:

代码语言:javascript
复制
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);
    }
}

但我认为肯定有更好的解决方案。你能帮我吗?

EN

回答 2

Stack Overflow用户

发布于 2017-10-20 14:12:49

尝试更正您的类声明(virtualICollection)。还要确保context.Configuration.LazyLoadingEnabled = true;

代码语言:javascript
复制
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;}
}
票数 1
EN

Stack Overflow用户

发布于 2017-10-20 14:20:20

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

代码语言:javascript
复制
var playlist = context.Videos
                   .Where(x => x.Id == videoId)
                   .Select(x => x.Playlist)
                   .FirstOrDefault();

还可以使用Include指定要加载的引用实体

代码语言:javascript
复制
var video = context.Videos
                   .Include(x => x.Playlist)
                   .FirstOrDefault(x => x.Id == videoId);
var playlist = video.Playlist;

第三个选项是virtual和延迟加载,正如@SlavaUtesinov回答的那样。但是如果你事先知道你想要播放列表,就不需要延迟加载,它只会创建不必要的中间查询。

如果你想加载一个视频列表,并且你只想访问其中一些视频的播放列表,而不是大多数/所有视频,那么延迟加载将是一个很好的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46840765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档