簡體   English   中英

使用ObjectSet有什么好處

[英]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的特殊原因以及我們如何知道何時使用?

ObjectContextObjectSet是遺留的EF代碼, DbSetDbContextObjectContext模型創建了包裝,使EF成為更好的體驗。

DbSetDbContext ,EF仍然使用ObjectContext / ObjectSet

從EF 7開始,他們擺脫了所有基本代碼,並重新編寫了整個EF ORM。

編輯

DbContext =您的實體模型的集合,與數據庫的連接,日志記錄,跟蹤和粘合,可能還有一大堆我錯過的東西。 此用戶包含一個或多個DbSets<YourEntity>

DbSet是表示特定實體的集合的對象。 其中包含緩存,插入,更新,僅選擇特定實體等信息。

我喜歡想到這些

DbContext =數據庫

DbSet =表

它們遠不止於此 ,但從概念上講,這就是我對它們進行可視化的方式,並不一定按照1:1進行映射。 例如,實體可以是表的子集,或者甚至可以是多個表的組合。

關於ObjectSetObjectContext我缺乏內部工作方式的經驗,以便告訴您確切的區別。 我知道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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM