2010-05-11 24 views
9

閱讀本標題爲「使用ObjectSet(實體框架)」的MSDN文章它顯示了有關如何添加產品的兩個示例..一個用於3.5,另一個用於4.0。3種通過實體框架添加「產品」的方法。有什麼不同?

http://msdn.microsoft.com/en-us/library/ee473442.aspx

通過我的知識缺乏的我在這裏很可能完全失去了一些東西,但我從來沒有加入像這樣的產品:

//In .NET Framework 3.5 SP1, use the following code: (ObjectQuery) 
    using (AdventureWorksEntities context = new AdventureWorksEntities()) 
    { 
     // Add the new object to the context. 
     context.AddObject("Products", newProduct); 
    } 

    //New in .NET Framework 4, use the following code: (ObjectSet) 
    using (AdventureWorksEntities context = new AdventureWorksEntities()) 
    { 
     // Add the new object to the context. 
     context.Products.AddObject(newProduct); 
    } 

我不會做它無論哪種方式,只是使用:

// (My familiar way) 
    using (AdventureWorksEntities context = new AdventureWorksEntities()) 
    { 
     // Add the new object to the context. 
     context.AddToProducts(newProduct); 
    } 

這三種方式有什麼區別?

「我的方式」是使用ObjectQuery的另一種方式嗎?

感謝, 鋼鈑

回答

9

他們都做同樣的事情,與語法的細微差別。

首先,讓我們看看3.5的方式和「你的方式」。如果你看一下你的EDMX的代碼生成的文件,你會看到類似這樣的:

public void AddToProducts(Product product) 
    { 
     base.AddObject("Products", product); 
    } 

所以這兩種方法是完全一樣的,只是在你的代碼中的魔法串由codegened的版本替換其能永遠不會錯。

「.NET 4方式」做同樣的事情,但做不同。它使用強類型ObjectSet<T>,它允許您動態創建強類型引用,但不使用字符串。但是,在將對象添加到上下文的情況下,我並不知道真正的優勢,只是它可以使您更加一致地瞭解如何引用實體 - 您可以使用相同的屬性從上下文中讀取它們(Context.Products),你用它來寫它們。

+0

ObjectSet被緩存在默認的代碼生成器中。 所以我猜想使用context.Products.Add會有一些輕微的性能提升,因爲它可以重新使用相同的集合而不用任何查找。 – 2010-05-11 15:11:15

+0

優秀。非常感謝您向我解釋這一點。事實證明,這比我想象的要簡單得多。我真的應該更頻繁地檢查所有這些生成的文件,以便更好地理解幕後發生的事情。我現在看一看,看看還有哪些事情正在發生! – 4imble 2010-05-11 16:17:34

+0

*非常值得閱讀codegen文件。即使你沒有寫,也可以隨時使用這些代碼。 – 2010-05-11 17:19:43