Entity framework .CreateObjectSet与<;T>。设置<;T>;,和.CreateQuery<;T>;?

Entity framework .CreateObjectSet与<;T>。设置<;T>;,和.CreateQuery<;T>;?,entity-framework,generics,datacontext,Entity Framework,Generics,Datacontext,我正在为entity framework编写一个通用存储库,对这些调用之间的区别感到困惑: ObjectContext.CreateObjectSet<T> ObjectContext.CreateQuery<T> DbContext.Set<T> ObjectContext.CreateObjectSet ObjectContext.CreateQuery DbContext.Set 我想要一个通用存储库,它既支持从.edmx文件生成的上下文,也支持代码

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

ObjectContext.CreateObjectSet<T>
ObjectContext.CreateQuery<T>
DbContext.Set<T>
ObjectContext.CreateObjectSet
ObjectContext.CreateQuery
DbContext.Set
我想要一个通用存储库,它既支持从.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;
    }
}
public抽象类EntityRepository
其中TClass:class,new()
{
//私有只读TContext\u上下文;
私有只读对象集\u对象集;
受保护的EntityRepository(IObjectContextAdapter上下文)
{
_objectSet=context.ObjectContext.CreateObjectSet();
}
受保护的EntityRepository(ObjectContext上下文)
{
_objectSet=context.CreateObjectSet();
}
公共对象集查询()
{
返回对象集;
}
}
在我在网上看到的例子中,我看到了所有3个都在使用,它们之间的实际区别是什么?一个更好的性能是明智的吗?我知道您可以使用所有3种方法针对上下文编写LINQ查询

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

CreateQuery
提供了
ObjectQuery
,可以像
IEnumerable
一样查看它(它也是
IQueryable
)。此对象类似于
ObjectSet
(某些条件等)的子集,但不能向其中添加项等等


最后,
Set
返回
DbSet
,这是代码优先的第一个方法/对象的简化版本。例如,更容易使用这些对象(或者更好地说是接口;
IDbSet
)进行单元测试等。类似于
ObjectContext
DbContext
是什么。

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

因此,对数据库中的每一个实体运行查询时,确实没有性能差异吗?在我的例子中,由于我的存储库没有存储实际的上下文,您认为我选择ObjectSet是正确的,这样我就可以用它执行所有CRUD操作了吗?基本上,就是ObjectSet:ObjectQuery。无论您是使用其中一种方法构建查询,都不会影响查询的执行。与CreateQuery相比,调用CreateObjectSet的开销最小(我们进行了一些元数据查找),但如果这种开销在现实世界中有任何可观察的影响,我会感到惊讶。在DbContext API上实现Set实际上比其他方法更简单。它也不应该有重大影响,而DbContext作为一个整体更简单,更易于使用API。