我正在尝试将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()语句在编译时没有捕获任何错误。有没有办法以类型安全的方式指定它?
/卡斯滕
答案 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。
关于“类型安全”的做法;这是“包括”相关记录的唯一方法。正如我所提到的,你可以使用可能更接近于“类型安全”的连接。