使用ObjectSet有什么好处

时间:2015-03-09 21:24:57

标签: c# entity-framework

正如MSDN建议我们可以使用以下 ObjectContext

using (AdventureWorksEntities context = new AdventureWorksEntities())
{
    // Add the new object to the context.
    context.Products.AddObject(newProduct);
}

然而,使用 ObjectSet<T>

还可以使用类似的代码
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
    ObjectSet<Product> pSet = context.CreateObjectSet<Product>();
    pSet.AddObject(newProduct);
}

文章第二段说:

  

在以.NET Framework版本4开头的版本中,您可以使用   以下在 ObjectSet 上定义的方法而不是等效方法   在 ObjectContext 上定义的。

使用 ObjectSet 代替 ObjectContext 是否存在特殊原因?我们如何知道何时使用?

2 个答案:

答案 0 :(得分:2)

ObjectContextObjectSet是旧版EF代码,DbSetDbContext已创建为ObjectContext模型的包装,以使EF获得更好的体验

DbSetDbContext下方,EF仍在使用ObjectContext / ObjectSet

从EF 7开始,他们摆脱了所有基本代码,并正在重写整个EF ORM。

修改

DbContext =您的实体模型的集合,与数据库的连接,日志记录,跟踪和粘合,可能还有一大堆我错过的东西。此用户包含1个或多个DbSets<YourEntity>

DbSet是表示特定实体的集合的对象。其中包含缓存,插入,更新,仅选择特定实体等信息。

我想要考虑这些

DbContext =数据库

DbSet =表

他们 ALOT 比这更多,但从概念上讲,这就是我对它们进行可视化的方式,并且不必按照1:1进行映射。例如。实体可以是表的子集,也可以是多个表的组合。

关于ObjectSetObjectContext我缺乏内部工作经验,以便告诉您确切的区别。我知道DbSet / Context是如何工作的,但我不知道ObjectSet / Context有多少是完成的,还有多少是附加的。

也许你可以在野外找到一个练习? :-P

答案 1 :(得分:1)

如果直接使用ObjectSet,则没有太大区别。

但是,通过一起使用ObjectContext和OBjectSet,您可以开发可重用的通用存储库类(CRUD)。您提供的代码示例仅适用于检索该应用程序的产品,而通用CRUD存储库将定义可以与任何表(以及其他数据库)一起使用的添加,读取,更新和删除方法。

e.g。 您可以定义IRepository接口

public interface IRepository<T> : IDisposable where T : class
{
    void Add(T entity);
    void Delete(T entity);
    void SaveChanges();
    ...
}

一个通用的具体类

public class DataRepository<C,T> : IRepository<T> where T : class where C : ObjectContext, new()
{
    private ObjectContext _context;
    private IObjectSet<T> _objectSet;
    public DataRepository() : this(new C()) { }
    public DataRepository(ObjectContext context)
    {
       _context = context;
       _objectSet = _context.CreateObjectSet<T>();
    }

    public void Add(T entity)
    {
       if(entity == null) throw new ArgumentNullException("entity");
       _objectSet.AddObject(entity);
    }

    public void Delete(Func<T, bool< predicate)
    {
        var records = from x in _objectSet.Where<T>(predicate) select x;
        foreach(T record in records)
           _objectSet.DeleteObject(record);
    }

    public void SaveChanges()
    {
        _context.SaveChanges();
    }

    // Other members

    // IDisposable members
}

上面的代码可以复制并粘贴到每个应用程序,或者在每个应用程序中单独组装和引用。

对于您的示例,您将在应用程序中创建此类以检索产品

public class ProductsRepo : DataRepository<AdventureWorksEntities, Product> {
    // You can add other specific methods not covered by the default CRUD methods here

}

并添加新产品

using(var repo = new ProductsRepo())
{
    repo.Add(newProduct);
    repo.SaveChanges();
}