我正在为实体框架编写通用存储库,并对这些调用之间的区别感到困惑:
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查询。
答案 0 :(得分:16)
CreateObjectSet<T>
会返回ObjectSet<T>
,它基本上是T对象的集合,能够添加,删除......来自此集合的对象,后来导致插入,删除,......您还可以用它来查询。它就像给定实体的顶级根。
CreateQuery<T>
为您提供ObjectQuery<T>
,可以将其视为IEnumerable<T>
(它也是IQueryable<T>
)。此对象类似于ObjectSet<T>
的子集(某些条件等),但您无法向其中添加项目等等。
最后Set<T>
返回DbSet<T>
,它是Code First的第一个方法/对象的简化版本。例如,使用这些对象(或更好地说接口; IDbSet<T>
)进行单元测试等更容易。ObjectContext
和DbContext
类似。
答案 1 :(得分:4)
除了Jiri已经解释过的内容之外,还有一个不带参数的CreateObjectSet重载。此重载将自动假定它必须返回与TEntity关联的唯一EntitySet的ObjectSet。如果模型具有MEST(每个类型多个实体集),它将抛出。 CreateQuery的所有重载都需要一个Entity SQL字符串来引导查询(请注意,EntitySet的名称是有效的Entity SQL查询)。