Entity framework EF代码第一个问题-未加载相关实体

Entity framework EF代码第一个问题-未加载相关实体,entity-framework,Entity Framework,这真烦人 我有这样的想法: class Person { ..properties id, name etc.. } class Task { ..properties id, name etc.. Person Moderator {get;set} } public class DataModel : DbContext { public DbSet<Task> Tasks { get; set; } public DbSet&l

这真烦人

我有这样的想法:

class Person {
   ..properties id, name etc..
}
class Task {
   ..properties id, name etc..
   Person Moderator {get;set}
}
public class DataModel : DbContext {
        public DbSet<Task> Tasks { get; set; }
        public DbSet<Person> People { get; set; }
}
Task t = db.Tasks.Include(x => x.Moderator).SingleOrDefault(p => p.Id == 22)
我要怎么做才能把整个对象图买回来?我必须加入SingleorDefault调用吗?似乎有点不对劲

我说过这真的很烦人


TIA,

您的
版主属性禁用了延迟加载功能,因此只有使用
Load()
显式加载时才会加载该属性

您可以使用查询中的方法强制EF急切地加载相关的
人员
实体,如下所示:

class Person {
   ..properties id, name etc..
}
class Task {
   ..properties id, name etc..
   Person Moderator {get;set}
}
public class DataModel : DbContext {
        public DbSet<Task> Tasks { get; set; }
        public DbSet<Person> People { get; set; }
}
Task t = db.Tasks.Include(x => x.Moderator).SingleOrDefault(p => p.Id == 22)

在中有一个非常好的概述。

您已经关闭了
版主
属性的延迟加载功能,因此只有使用
加载()
显式加载时才会加载该属性

您可以使用查询中的方法强制EF急切地加载相关的
人员
实体,如下所示:

class Person {
   ..properties id, name etc..
}
class Task {
   ..properties id, name etc..
   Person Moderator {get;set}
}
public class DataModel : DbContext {
        public DbSet<Task> Tasks { get; set; }
        public DbSet<Person> People { get; set; }
}
Task t = db.Tasks.Include(x => x.Moderator).SingleOrDefault(p => p.Id == 22)

中有一个非常好的概述。

两个选项供您选择。默认情况下,code first/dbContext模型返回从您的模型派生的代理对象(当您遇到JSON序列化问题时,了解这一点很重要)。代理对象使用延迟加载关联,但仅在某些情况下使用。主持人属性必须声明为虚拟,以便代理可以覆盖它并为您执行延迟加载

但是,延迟加载可能会产生一个称为的问题。如果在大多数情况下,你只需要任务,而不需要主持人,这不会是一个问题。但是,如果您经常显示任务及其相关主持人的列表,则除了原始列表的1外,您还必须为该列表中的每个任务运行额外的数据库往返(例如,对于100个任务的列表,您将执行101次查询以显示任务及其主持人)

为了避免这种情况,这将强制关系加载。这样使用它

Task t=db.Tasks.Include(t=>t.mediator).SingleOrDefault(p=>p.Id== 22);


希望这对您有所帮助。

有两种选择。默认情况下,code first/dbContext模型返回从您的模型派生的代理对象(当您遇到JSON序列化问题时,了解这一点很重要)。代理对象使用延迟加载关联,但仅在某些情况下使用。主持人属性必须声明为虚拟,以便代理可以覆盖它并为您执行延迟加载

但是,延迟加载可能会产生一个称为的问题。如果在大多数情况下,你只需要任务,而不需要主持人,这不会是一个问题。但是,如果您经常显示任务及其相关主持人的列表,则除了原始列表的1外,您还必须为该列表中的每个任务运行额外的数据库往返(例如,对于100个任务的列表,您将执行101次查询以显示任务及其主持人)

为了避免这种情况,这将强制关系加载。这样使用它

Task t=db.Tasks.Include(t=>t.mediator).SingleOrDefault(p=>p.Id== 22);

希望这有帮助