【问题标题】:Differences between .CreateObjectSet<T>, .Set<T>, and .CreateQuery<T>?.CreateObjectSet<T>、.Set<T> 和 .CreateQuery<T> 之间的区别?
【发布时间】:2012-01-20 20:24:38
【问题描述】:

我正在为实体框架编写一个通用存储库,但对这些调用之间的区别感到困惑:

ObjectContext.CreateObjectSet<T>
ObjectContext.CreateQuery<T>
DbContext.Set<T>

我想要一个既支持从 .edmx 文件生成的上下文又支持代码优先 DbContext 的通用存储库,所以我有这个:

 public abstract class EntityRepository<TClass>
   where TClass : class, new()
{
    //private readonly TContext _context;
    private readonly ObjectSet<TClass> _objectSet;

    protected EntityRepository(IObjectContextAdapter context)
    {
        _objectSet = context.ObjectContext.CreateObjectSet<TClass>();

    }

    protected EntityRepository(ObjectContext context)
    {
        _objectSet = context.CreateObjectSet<TClass>();
    }

    public ObjectSet<TClass> Query()
    {
        return _objectSet;
    }
}

在我在网上看到的示例中,我已经看到所有 3 个都使用过,它们之间的实际区别是什么?更好的表现是明智的吗?我知道您可以使用所有 3 种方法针对上下文编写 LINQ 查询。

【问题讨论】:

    标签: entity-framework generics datacontext


    【解决方案1】:

    CreateObjectSet&lt;T&gt; 返回您ObjectSet&lt;T&gt;,它基本上是 T 对象的集合,能够从该集合中添加、删除、...对象,稍后会导致插入、删除...您也可以使用它进行查询.这就像给定实体的顶级根。

    CreateQuery&lt;T&gt; 为您提供ObjectQuery&lt;T&gt;,可以像IEnumerable&lt;T&gt; 一样查看(它也是IQueryable&lt;T&gt;)。该对象类似于ObjectSet&lt;T&gt; 的子集(某些条件等),但您不能向其添加项目等等。

    最后,Set&lt;T&gt; 返回 DbSet&lt;T&gt;,这是 Code First 的第一个方法/对象的简化版本。例如,使用这些对象(或者更好地说是接口;IDbSet&lt;T&gt;)进行单元测试等更容易。类似于ObjectContextDbContext

    【讨论】:

    • 那么在针对每个数据库运行查询时真的没有性能差异吗?在我的情况下,由于我的存储库没有存储实际的上下文,你会说我选择了 ObjectSet 的正确路径,所以我可以用它做所有的 CRUD 操作吗?
    • 从根本上说,ObjectSet:ObjectQuery。无论您是使用其中一种构建查询,都不会影响查询的执行。与 CreateQuery 相比,对 CreateObjectSet 的调用开销最小(我们进行了一些元数据查找),但如果这种开销在现实世界中有任何可观察到的影响,我会感到惊讶。 DbContext API 上的 Set 的实现实际上是其他方法之上的一个薄层。它也应该不会产生重大影响,并且 DbContext 整体上更简单,更易于使用 API。
    【解决方案2】:

    除了 Jiri 已经解释过的内容之外,还有一个不带参数的 CreateObjectSet 重载。此重载将自动假定它必须返回与 TEntity 关联的唯一 EntitySet 的 ObjectSet。如果模型具有 MEST(每个类型的多个实体集),它将抛出。 CreateQuery 的所有重载都需要一个 Entity SQL 字符串来引导查询(请注意,EntitySet 的名称是有效的 Entity SQL 查询)。

    【讨论】:

      猜你喜欢
      • 2015-11-15
      • 2011-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-07
      • 1970-01-01
      • 2021-04-09
      相关资源
      最近更新 更多