在 EF 5 中指定无跟踪合并选项时强制转换错误

本文关键字:选项 错误 转换 合并 跟踪 EF | 更新日期: 2023-09-27 18:32:26

我在数据库优先设计中使用 EntityFramework 5.0.0,并尝试使用 http://blogs.msdn.com/b/dsimmons/archive/2010/01/12/ef-merge-options-and-compiled-queries.aspx 中介绍的方法对非常大的结果集的某些查询指定 NoTracking MergeOption

我的代码看起来像这样:

using (var dbContext = Utility.GetDataContext()) {
    IQueryable<EntityTypeA> entitiesQry = dbContext.EntitiesA.Where(x => (x.field== this.Property));
    ((System.Data.Object.ObjectQuery)entitiesQry).MergeOption = System.Data.Objects.MergeOption.NoTracking;
    foreach (var rec in entitiesQry) {
        // do things...
    }
}

但是,我在转换实体Qry时遇到运行时异常:

无法将类型为"System.Data.Entity.Infrastructure.DbQuery'1[Namespace.EntityTypeA]"的对象强制转换为类型"System.Data.Objects.ObjectQuery"。

考虑到该文章的年龄和不同的命名空间,我猜这是 EF 4 和 EF 5 之间发生了变化?但是我找不到更合适的方法来指定合并选项...任何帮助将不胜感激。

需要明确的是:我的代码在没有设置 MergeOption 的行的情况下运行得很好,但鉴于我的数据集有数百万条记录,我遇到了"内存问题"。

在 EF 5 中指定无跟踪合并选项时强制转换错误

如果你想

使用ObjectQuery那么你需要获取底层ObjectContext并从那里制定你的查询。

ObjectQuery<EntitiesA> objQuery = ((IObjectContextAdapter)ctx)
   .ObjectContext.CreateObjectSet<EntitiesA>()
   .Where(x => x.field == this.Property);

如果您希望使用 DbContext API 进行无跟踪查询,则可以使用 AsNoTracking()

IQueryable<EntityTypeA> entitiesQry = dbContext.EntitiesA.AsNoTracking()
                           .Where(x => x.field== this.Property);