linq实体框架包括奇怪的行为
当我没有显式地将include用于导航属性时,我对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
---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实例中添加了一些任务?