6

我是实体框架的新手,但可能会误解某些东西,或者做错了什么。

我的代码,让我得到一个特定人的任务列表:

 public List<TaskObject> GetAssignedTasks(int personId)
        {
            var items = (from s in _te.tasks where s.person.person_id == personId select s).ToList();
            var tasks = new List<TaskObject>();
            foreach (var t in items)
            {

                TaskObject tk = Transformer.UnpackTask(t);

                tasks.Add(tk);
            }
            return tasks;
        }

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

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

我是不是误会了?

4

3 回答 3

5

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

MSDN 参考

于 2012-08-19T08:44:34.963 回答
0

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

检查事项:

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

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

tasks metadata
 {
 ... 
 ... 

  \\these two should already be there you will just have to add the Include and
  \\ Key attribute.

    [Include]
    public EntityCollection<Person> Person {get; set;}
    [Key]  \\ that connects the task and person entity (FK/PK)
    public int PersonID {get;set;}
}

服务文件

public List<TaskObject> 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<TaskObject>();
        foreach (var t in items)
        {

            TaskObject tk = Transformer.UnpackTask(t);

            tasks.Add(tk);
        }
        return tasks;
    }

希望能帮助到你。干杯

于 2012-08-19T10:17:15.600 回答
0

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

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

.Include您的父母(或相关记录)将被附加并传递,而没有他们将是nulls

于 2014-12-19T09:18:44.587 回答