正如ObjectContext建议的那样,我们可以使用以下MSDN
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);
}文章的第二段说:
在从ObjectContext.框架版本4开始的版本中,可以使用在ObjectSet上定义的以下方法,而不是在ObjectSet上定义的等效方法
是否有特定的理由使用ObjectSet而不是ObjectContext,我们如何知道什么时候使用?
发布于 2015-03-09 21:27:17
ObjectContext和ObjectSet是遗留的EF代码,DbSet和DbContext为它们创建了围绕ObjectContext模型的包装器,以使EF获得更好的体验。
在DbSet和DbContext下面,EF仍在使用ObjectContext / ObjectSet。
从EF 7开始,他们去掉了所有的基本代码,并且正在重新编写整个EF。
编辑
DbContext =实体模型的集合、到数据库的连接、日志记录、跟踪和胶水,可能还有很多我错过的东西。这个通常包含一个或多个DbSets<YourEntity>
DbSet是一个对象,表示特定实体的集合。这包含诸如缓存、插入、更新、只为特定实体进行选择等信息。
我喜欢把这些
DbContext =数据库
DbSet =表
它们不仅仅是,但从概念上讲,这就是我对它们的可视化方式,而不一定要映射1:1。例如,一个实体可能是一个表的子集,甚至可能是多个表的组合。
关于ObjectSet和ObjectContext,我缺乏关于它们内部工作方式的经验,以便告诉您确切的区别。我知道DbSet/Context是如何工作的,但我不知道ObjectSet/Context完成了多少任务,还有多少是额外的。
也许是一次运动,让你在野外找到答案?
发布于 2015-03-09 22:09:45
如果直接使用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();
}https://stackoverflow.com/questions/28952029
复制相似问题