Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
linq实体框架包括奇怪的行为_Linq_Entity Framework_C# 4.0 - Fatal编程技术网

linq实体框架包括奇怪的行为

linq实体框架包括奇怪的行为,linq,entity-framework,c#-4.0,Linq,Entity Framework,C# 4.0,当我没有显式地将include用于导航属性时,我对linq查询有一个问题 ---Task entity model ---- ... public Project Project { get; set; } public TaskType TaskType { get; set; } ... var tasks = db.Tasks .Where(t => (t.Project.ProjectId == project.ProjectId)) foreach (T

当我没有显式地将include用于导航属性时,我对linq查询有一个问题

---Task entity model ----
...
 public Project Project { get; set; }
 public TaskType TaskType { get; set; }
...

var tasks = db.Tasks
        .Where(t => (t.Project.ProjectId == project.ProjectId))


foreach (Task t in tasks)
{
 // for some items t.TaskType is null   


// I have noticed that when t.TaskType.Id 
// is different to the first one in the loop then only the next different 
// tasktype is null

} 


// however when using 
var tasks = db.Tasks.Include(t=>t.TaskType)
        .Where(t => (t.Project.ProjectId == project.ProjectId))          
// tasktype is always there (where as without the include in some tasks it  does not extract the tasktype)

使用.Include修复了我的问题,但我想了解它为何会出现这种情况。

如果在EF中使用“急切加载”,则导航属性不会随根对象加载。Include方法指示EF,该导航属性应与根对象一起加载

使用Lazy-load加载导航属性时,当您调用此属性时,所以如果使用Lazy-load,则Include方法不是必需的


更多

我认为您需要的是延迟加载相关实体。为此,您需要将导航属性指定为虚拟属性。由此:

延迟加载是一个实体或集合 实体在第一次加载时自动从数据库加载 访问引用实体的属性。使用时 POCO实体类型,通过创建 派生的代理类型,然后重写虚拟属性以添加 装载钩

在导航属性中指定virtual关键字时,EF会在运行时为实体类创建动态代理。这些代理类负责相关实体的延迟加载行为。如果没有虚拟,将不支持延迟加载,并且您的导航属性将为null。因此,您需要这样做:

public class Task
{
   //...
   public virtual Project Project { get; set; }
   public virtual TaskType TaskType { get; set; }
{
在这里,您将找到支持延迟加载所需遵循的所有要求


使用Include方法,您可以作为查询的一部分急切地加载相关实体。

是否只急切地加载某些项目的导航属性,而不加载其他项目的导航属性?如上所述,我逐步完成了foreach循环,有些任务没有包含任务类型。我希望渴望加载的行为是一致的。@wfquestions-Before-var-tasks=db.tasks.Wheret=>t.Project.projectd==Project.projectd查询如何使用DbContext的db实例?也许您在这个DbContext实例中添加了一些任务?