实体框架数据优先:自动加载关联数据

时间:2011-10-07 19:03:51

标签: entity-framework

我正在尝试将Entity Framework与现有数据库一起使用。使用代码优先方法,我得到了以下自动创建的模型(其中 - 我试图缩短代码以获得问题的本质):

namespace Fidd.Models
{
    using System;
    using System.Collections.Generic;

    public partial class Movies
    {
        public Movies()
        {
            ...
            this.MoviesPictures = new HashSet<MoviesPictures>();
            ...
        }

        public int MovieID { get; set; }
        public string MovieName { get; set; }
        ...

        public virtual ICollection<MoviesPictures> MoviesPictures { get; set; }
    }
}

所以基本上这是电影和电影之间的1-n关系。我还在学习EF。

如果我想用

加载一部电影
var movie = from m in dbContext.Movies
            where m.MovieID == 5
            select m;

如何自动加载MoviesPictures集合?无论是渴望还是懒惰。

更新:实际上有一个额外的关联:

电影1..n MoviesPictures n..1图片

MoviesPictures模型的定义如下:

public partial class MoviesPictures
{
    public int MoviePictureID { get; set; }
    public int MoviePictureMovieID { get; set; }
    public int MoviePicturePictureID { get; set; }
    public System.DateTime MoviePictureAddDatetime { get; set; }
    public bool MoviePictureRemoved { get; set; }
    public Nullable<System.DateTime> MoviePictureRemovedDatetime { get; set; }

    public virtual Movies Movies { get; set; }
    public virtual Pictures Pictures { get; set; }
}

有没有办法在同一个查询中急切加载这个2.关联层?我试过这样做:

var model = from m in db.Movies.Include("MoviesPictures").Include("Pictures")
            where m.MovieID == id
            select m

哪个不起作用 - 我得到一个运行时异常,即没有使用Movies中的导航属性定义图片。这当然有道理。我只是不知道如何指定查询。

让我担心的另一件事......上面的Include()语句在编译时没有捕获任何错误。有没有办法以类型安全的方式指定它?

/卡斯滕

1 个答案:

答案 0 :(得分:2)

你想要这样做:

var movie = from m in dbContext.Movies.Include("MoviesPictures")
            where m.MovieId == 5
            select m;

这是急切地从“MoviesPictures”表中获取记录。您可以在此处阅读更多相关信息:http://msdn.microsoft.com/en-us/magazine/cc507640.aspx。此外,如果你谷歌“实体框架包括”,你可能会找到更多的信息。

<强>更新

您可以.Include("MoviesPictures.Pictures")这取决于您的设置方式。如果没有,那么你想做一些连接;这里有一篇很好的博客文章:关于加入的http://weblogs.asp.net/salimfayad/archive/2008/07/09/linq-to-entities-join-queries.aspx

关于“类型安全”的做法;这是“包括”相关记录的唯一方法。正如我所提到的,你可以使用可能更接近于“类型安全”的连接。