我是实体框架新手,但可能会误解某些内容,或者做错了什么。
我的代码,让我获得特定人员的任务列表:
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。我以为它会加载相关项目。
我是不是理解错了?
您应该使用 Include() 方法显式包含引用。 它有两个重载:一个将属性作为 lambda 表达式,另一个将路径作为字符串加载(当您需要加载集合中可用对象的引用时很有用)。
你正在寻找的是
.Include
你这样使用它
var recordWithParentAttached = db.Tasks.Include(o => o.Person).Single(o => o.person_id == personId);
有了
.Include
,您的父母(或相关记录)将会被附上并传递,而没有他们将会 nulls
。
试试这个。我们在这里尝试做的是将相关实体包含在选择查询本身中,即延迟加载。因此,当您解压任务时,您应该也能够获得相关实体。
需要检查的事项:
-- 例如您创建的服务的元数据文件。
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;
}
希望有帮助。 干杯
另外,检查您是否使用了正确的 Include()。
来自 Microsoft.EntityFrameworkCore 命名空间的命名空间,而不是 System.Data.Entity。