假设我有一个实体<div>
,其属性为PersonEntity
,导航类型为EyeColorId
。有没有一种方法可以预取EyeColorEntity
,而无需保存实体,也不必仅查询EyeColorEntity
。
例如。
EyeColor
理论上,这将填充实体上的导航属性。结果看起来像这样。
public class PersonEntity
{
public int Id { get; set; }
public int EyeColorId { get; set; }
public EyeColorEntity EyeColor { get; set; }
}
public void FillFromDbExample(DbContext context)
{
var personEntity = new PersonEntity()
{
EyeColorId = 5
};
context.SetNavigationProperties(personEntity);
}
这里的窍门是,我不想单独查询每个属性,也不想将实体保存到数据库以拉回这些属性。 EnityFramework 6.2.0中是否存在上述功能?
答案 0 :(得分:1)
您可以预加载上下文中的所有属性,以使关系修复工作。例如:
context.EyeColors.Load();
var personEntity = new PersonEntity()
{
EyeColorId = 5
};
context.Persons.Attach(personEntity);
在最后一条语句中,EF自动填充了personEntity.EyeColor
。
或者,您可以通过将实体初始化为延迟加载代理来依赖延迟加载。该属性必须为virtual
才能启用代理创建:
public virtual EyeColorEntity EyeColor { get; set; }
然后:
var personEntity = context.Persons.Create(); // Creates a proxy
personEntity.EyeColorId = 5;
context.Persons.Attach(personEntity);
现在,当访问EyeColor
(=延迟加载)时,EF将从数据库查询匹配的personEntity.EyeColor
。
我不想单独查询每个属性
延迟加载会单独查询属性,但不是您必须这样做。
请注意,在两种情况下,personEntity
必须附加到上下文。