entity framework未加载相关对象

我是Entity Framework的新手,但可能会误解某些内容,或者做错了什么。

我的代码,为我提供一个特定人员的任务列表:

public List GetAssignedTasks(int personId) { var items = (from s in _te.tasks where s.person.person_id == personId select s).ToList(); var tasks = new List(); foreach (var t in items) { TaskObject tk = Transformer.UnpackTask(t); tasks.Add(tk); } return tasks; } 

我的问题是,它似乎得到了一个记录列表,但没有加载相关的项目。 我的’Transformer.UnpackTask’方法接受我加载的任务实体,然后将其转换为另一个通过业务/服务层上传到UI的对象。

但是一旦我的Unpacker函数尝试引用一个相关对象的项目(例如,一个任务有一个’AssignedPerson’,它有一个带有人员详细信息的Person实体。但是我的实体的AssignedPerson属性是NULL。我想它会加载相关的项目。

我误会了吗?

您应该使用Include()方法显式包含引用。 它有两个重载:一个将属性作为lambda表达式,另一个将路径作为字符串加载(当您需要加载对集合中可用对象的引用时很有用)。

MSDN参考

试试这个。 我们在这里尝试做的是在select查询本身中包含相关实体,延迟加载。 因此,当您解压缩任务时,您应该能够获得相关实体。

要检查的事项:

  • 任务实体应具有对其他人的实体的浏览能力,否则将失败。
  • 在服务层的元数据文件中的任务元数据内的人员实体之上添加[Include]关键字。

– 例如您创建的服务的元数据文件。

 tasks metadata { ... ... \\these two should already be there you will just have to add the Include and \\ Key attribute. [Include] public EntityCollection Person {get; set;} [Key] \\ that connects the task and person entity (FK/PK) public int PersonID {get;set;} } 

服务文件

 public List GetAssignedTasks(int personId) { var items = (from s in _te.tasks.Include("Person") where s.person.person_id == personId select s).ToList(); var tasks = new List(); foreach (var t in items) { TaskObject tk = Transformer.UnpackTask(t); tasks.Add(tk); } return tasks; } 

希望能帮助到你。 干杯

你在寻找的是。 .Include你这样使用它

 var recordWithParentAttached = db.Tasks.Include(o => o.Person).Single(o => o.person_id == personId); 

with。 .Include你的父母(或相关记录)将被附加和传递,而不会是nulls