[英]What is the advantage of using ObjectSet
正如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
的特殊原因以及我们如何知道何时使用?
ObjectContext
和ObjectSet
是遗留的EF代码, DbSet
和DbContext
为ObjectContext
模型创建了包装,使EF成为更好的体验。
在DbSet
和DbContext
,EF仍然使用ObjectContext
/ ObjectSet
。
从EF 7开始,他们摆脱了所有基本代码,并重新编写了整个EF ORM。
编辑
DbContext
=您的实体模型的集合,与数据库的连接,日志记录,跟踪和粘合,可能还有一大堆我错过的东西。 此用户包含一个或多个DbSets<YourEntity>
DbSet
是表示特定实体的集合的对象。 其中包含缓存,插入,更新,仅选择特定实体等信息。
我喜欢想到这些
DbContext
=数据库
DbSet
=表
它们远不止于此 ,但从概念上讲,这就是我对它们进行可视化的方式,并不一定按照1:1进行映射。 例如,实体可以是表的子集,或者甚至可以是多个表的组合。
关于ObjectSet
和ObjectContext
我缺乏内部工作方式的经验,以便告诉您确切的区别。 我知道DbSet / Context是如何工作的,但是我不知道它有多少是由ObjectSet / Context完成的,还有多少是额外的。
也许是一个让你在野外找到的练习? :-P
如果直接使用ObjectSet,则没有太大区别。
但是,通过一起使用ObjectContext和OBjectSet,您可以开发可重用的通用存储库类(CRUD)。 您提供的代码示例仅适用于检索该应用程序的产品,而通用CRUD存储库将定义可以与任何表(以及其他数据库)一起使用的添加,读取,更新和删除方法。
例如,您可以定义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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.