Entity framework .CreateObjectSet与<;T>。设置<;T>;,和.CreateQuery<;T>;?
我正在为entity framework编写一个通用存储库,对这些调用之间的区别感到困惑: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文件生成的上下文,也支持代码
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。