【问题标题】:Access Id of parent entity without actually loading it in EntityFramework code first父实体的访问 ID,而无需先将其实际加载到 EntityFramework 代码中
【发布时间】:2013-09-17 16:44:45
【问题描述】:

我有两个实体:

public class Parent
{
    public Guid Id { get; set; }

    public string Name { get; set; }
}

public class Child
{
    public Guid Id { get; set; }

    public string Name { get; set; }

    public Parent Parent { get; set; }
}

我可以使用 Include 查询有或没有父实体的子实体。

public void Test()
{
    var child = context.Set<Child>().Include(x => x.Parent)
                       .FirstOrDefault(x => x.Id == Guid.Parse("<some_id>"));
}

但在某些情况下,我已经将所有父实体缓存在内存中,并且我想跳过连接并查询仅加载了 Id 属性的子实体。然后通过 Id 从缓存中获取实际的 Parent:

public void Test()
{
    var cachedParents = new List<Parent>();

    var child = context.Set<Child>()
                       .FirstOrDefault(x => x.Id == Guid.Parse("<some_id>"));
    var parent = cachedParents.FirstOrDefault(x => x.Id == child.Parent.Id);
}

但是 child 加载了 child.Parent == null。

有没有办法让 child.Parent 被加载或只访问 child.Parent.Id(ParentId 列)属性?

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    您可以使用Select 从数据库中获取单个属性(或任何属性选择):

    Guid childId = Guid.Parse("<some_id>");
    var parentId = context.Set<Child>()
                          .Where(x => x.Id == childId)
                          .Select(x => x.Parent.Id)
                          .FirstOrDefault();
    
    var parent = cachedParents.FirstOrDefault(x => x.Id == parentId);
    

    【讨论】:

    • 如果您在上下文中禁用延迟加载并尝试调试它,您将看到 x.Parent 已加载。 // 通过禁用延迟加载 child.Parent 将始终为 null var childs = context.Set() .Where(x => x.Id == childId).ToList(); // 在这个语句之后你会看到 child.Parent 被加载了 var parentId = context.Set() .Where(x => x.Id == childId) .Select(x => x.Parent.Id) .FirstOrDefault();
    猜你喜欢
    • 1970-01-01
    • 2016-07-08
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    相关资源
    最近更新 更多