首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ObjectSet的优点是什么

使用ObjectSet的优点是什么
EN

Stack Overflow用户
提问于 2015-03-09 21:24:57
回答 2查看 3.4K关注 0票数 1

正如ObjectContext建议的那样,我们可以使用以下MSDN

代码语言:javascript
复制
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
    // Add the new object to the context.
    context.Products.AddObject(newProduct);
}

但是,在使用ObjectSet<T>时,还可以使用类似的代码。

代码语言:javascript
复制
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
    ObjectSet<Product> pSet = context.CreateObjectSet<Product>();
    pSet.AddObject(newProduct);
}

文章的第二段说:

在从ObjectContext.框架版本4开始的版本中,可以使用在ObjectSet上定义的以下方法,而不是在ObjectSet上定义的等效方法

是否有特定的理由使用ObjectSet而不是ObjectContext,我们如何知道什么时候使用?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-09 21:27:17

ObjectContextObjectSet是遗留的EF代码,DbSetDbContext为它们创建了围绕ObjectContext模型的包装器,以使EF获得更好的体验。

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

从EF 7开始,他们去掉了所有的基本代码,并且正在重新编写整个EF。

编辑

DbContext =实体模型的集合、到数据库的连接、日志记录、跟踪和胶水,可能还有很多我错过的东西。这个通常包含一个或多个DbSets<YourEntity>

DbSet是一个对象,表示特定实体的集合。这包含诸如缓存、插入、更新、只为特定实体进行选择等信息。

我喜欢把这些

DbContext =数据库

DbSet =表

它们不仅仅是,但从概念上讲,这就是我对它们的可视化方式,而不一定要映射1:1。例如,一个实体可能是一个表的子集,甚至可能是多个表的组合。

关于ObjectSetObjectContext,我缺乏关于它们内部工作方式的经验,以便告诉您确切的区别。我知道DbSet/Context是如何工作的,但我不知道ObjectSet/Context完成了多少任务,还有多少是额外的。

也许是一次运动,让你在野外找到答案?

票数 2
EN

Stack Overflow用户

发布于 2015-03-09 22:09:45

如果直接使用ObjectSet,差别不大。

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

例如,您可以定义一个IRepository接口

代码语言:javascript
复制
public interface IRepository<T> : IDisposable where T : class
{
    void Add(T entity);
    void Delete(T entity);
    void SaveChanges();
    ...
}

和一个通用的具体类

代码语言:javascript
复制
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
}

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

对于您的示例,您可以在应用程序中创建这个类来检索产品。

代码语言:javascript
复制
public class ProductsRepo : DataRepository<AdventureWorksEntities, Product> {
    // You can add other specific methods not covered by the default CRUD methods here

}

添加一个新产品

代码语言:javascript
复制
using(var repo = new ProductsRepo())
{
    repo.Add(newProduct);
    repo.SaveChanges();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28952029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档