0

我需要加载实体的导航属性。我一直在阅读一篇关于如何使用 Entity Framework (6.0) 加载导航属性的不同方法的精彩文章。

第二种显式加载的方法是来自 ObjectContext,而不是来自 EntityCollection 或 EntityReference。如果您依赖 Entity Framework 中的 POCO 支持,您的导航属性将不是 EntityCollections 或 EntityReferences,因此不会有 Load 方法。相反,您可以使用 ObjectContext.LoadProperty 方法。LoadProperty 使用泛型来标识要从中加载的类型,然后使用 lambda 表达式来指定要加载的导航属性。下面是使用 LoadProperty 检索特定人员实例的 Pets 的示例:

context.LoadProperty<Family>(familyInstance, f => f.Pets)

现在我唯一需要知道的是:

如何获得对 ObjectContext 的引用?

DbContext似乎不是从它派生的,也没有对它的引用。LoadProperty<T>不是静态的,所以我确实需要一个对象引用。

4

1 回答 1

1

我知道有 2 种方法可以使用 DbContext 加载相关集合。

一个是您询问的选项,但是我已经使用了一段时间的另一种方法,不需要引用 ObjectContext。此方法适用于 DbEntityEntry 集合。这是一个例子:

public void Load<TEntity, TElement>(
        TEntity entity, 
        Expression<Func<TEntity, ICollection<TElement>>> relation)
    where TEntity : AbstractEntity, new()
    where TElement : AbstractEntity, new()
{
    var x = _context.Entry(entity);
    if (!x.State.Is(EntityState.Detached) && !x.State.Is(EntityState.Added))
        x.Collection(relation).Load();
}

或者

public void Load<TEntity, TElement>(
        TEntity entity, 
        Expression<Func<TEntity, TElement>> relation)
    where TEntity : AbstractEntity, new()
    where TElement : AbstractEntity, new()
{
    var x = _context.Entry(entity);
    if (!x.State.Is(EntityState.Detached) && !x.State.Is(EntityState.Added))
        x.Reference(relation).Load();
}
于 2013-03-02T13:08:08.367 回答