有没有填充实体而不将实体保存到数据库的方法?

时间:2019-06-21 19:18:43

标签: c# entity-framework

假设我有一个实体<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中是否存在上述功能?

1 个答案:

答案 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必须附加到上下文。