【问题标题】:Cannot Eager Load Entity Framework Child Entities无法急切加载实体框架子实体
【发布时间】:2015-06-03 22:13:56
【问题描述】:

我已经实现了一个 UnitOfWork 风格的工作方法,我似乎无法在 EntityFramework 6 中强制加载。每次我使用“Include()”语法时,它似乎都被忽略了,生成的 SQL 不会执行任何这种形式的连接会导致生成大量 SQL,因为每个子实体都必须通过其 ID 在数据库中进行查询。

这是我的设置:

public class UnitOfWork : IUnitOfWork
{
    private readonly SimpleStorageEntities _simpleStorageEntities;

    public UnitOfWork()
    {
        _simpleStorageEntities = new SimpleStorageEntities();
    }

    public List<T> Query<T>(Expression<Func<T, bool>> predicate, params Expression<Func<T, object>>[] loadOptions) where T : class
    {
        var set = _simpleStorageEntities.Set<T>();

        if (loadOptions.Any())
        {
            foreach (var expression in loadOptions)
            {
                set.Include(expression);
            }
        }
        return set.Where(predicate).ToList();
    }
}

我的调用如下:

var entries = _unitOfWork.Query<Entry>(e => e.TableId == tableId,
            e => e.AttributeValues);

即使我已指定要加载 AttributeValues,但每次通过 foreach 访问一个数据库时,都会进行一次数据库调用。我试图在 UnitOfWork 的构造函数中明确指定 Includes,但这似乎没有任何区别。

编辑:检查 EF 上的以前版本只是为了确保它与版本无关,没有运气

有什么想法吗?

【问题讨论】:

    标签: c# entity-framework entity-framework-6


    【解决方案1】:

    我发现上面的代码存在问题。它在 loadOptions 的 foreach 中。

    这个:

    set.Include(expression);
    

    实际上应该是:

    set = set.Include(expression);
    

    否则 Include 将被忽略,因为它没有被写回要执行的集合。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-09
      • 2012-02-07
      • 1970-01-01
      • 2012-09-10
      • 1970-01-01
      • 1970-01-01
      • 2011-05-03
      • 2021-10-21
      相关资源
      最近更新 更多