正如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
是否存在特殊原因?我们如何知道何时使用?
答案 0 :(得分:2)
ObjectContext
和ObjectSet
是旧版EF代码,DbSet
和DbContext
已创建为ObjectContext
模型的包装,以使EF获得更好的体验
在DbSet
和DbContext
下方,EF仍在使用ObjectContext
/ ObjectSet
。
从EF 7开始,他们摆脱了所有基本代码,并正在重写整个EF ORM。
修改强>
DbContext
=您的实体模型的集合,与数据库的连接,日志记录,跟踪和粘合,可能还有一大堆我错过的东西。此用户包含1个或多个DbSets<YourEntity>
DbSet
是表示特定实体的集合的对象。其中包含缓存,插入,更新,仅选择特定实体等信息。
我想要考虑这些
DbContext
=数据库
DbSet
=表
他们 ALOT 比这更多,但从概念上讲,这就是我对它们进行可视化的方式,并且不必按照1:1进行映射。例如。实体可以是表的子集,也可以是多个表的组合。
关于ObjectSet
和ObjectContext
我缺乏内部工作经验,以便告诉您确切的区别。我知道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();
}