c# - 无法预先加载 Entity Framework 子实体

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

我已经实现了 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 上检查了以前的版本,只是为了确保它与版本无关,运气不好

有什么想法吗?

最佳答案

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

这个:

set.Include(expression);

实际上应该是:

set = set.Include(expression);

否则,Include 将被简单地忽略,因为它不会被写回要执行的集合。

关于c# - 无法预先加载 Entity Framework 子实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30618010/

相关文章:

c# - 一个并发词典中的更新反射(reflect)在主词典中

c# - 预加载和显式加载之间的区别

c# - Mysql Entity Framework 上的 Guid 属性

entity-framework - 在主键 Entity Framework 6.0 上创建非聚集索引

c# - 如何在 DataGridTextColumn WPF XAML 中将绑定(bind)值设置为 TargetNullValue 属性

c# - 连接到 MS Access 数据库

带有常量的 C# 泛型

c# - DAO 的类级错误处理程序

c# - 如何使用多个子句对 Entity Framework 的异步方法进行单元测试

c# - 如何进行集成测试和端到端测试?