[英]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.