.CreateObjectSet <t>,。set <t>和.CreateQuery <t>之间的差异?</t> </t> </t>

时间:2012-01-20 20:24:38

标签: entity-framework generics datacontext

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

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查询。

2 个答案:

答案 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>)进行单元测试等更容易。ObjectContextDbContext类似。

答案 1 :(得分:4)

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