3 способа добавления «Продукта» через Entity Framework. Какая разница?

В этой статье MSDN под заголовком «Работа с ObjectSet (Entity Framework)» показаны два примера добавления продукта: один для 3.5, а другой для 4.0.

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?

Спасибо, Кохан

Ответы на вопрос(1)

Решение Вопроса

Все они делают то же самое, с небольшими различиями в синтаксисе.

Во-первых, давайте посмотрим на 3,5 пути и «ваш путь». Если вы посмотрите на файл codegen для вашего EDMX, вы увидите что-то вроде:

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

Таким образом, эти два метода абсолютно одинаковы, за исключением того, что волшебная строка в вашем коде заменяется версией с кодовым кодом, которая никогда не может быть неправильной.

«.NET 4 way» делает то же самое, но делает это по-другому. Использует строго типизированныйObjectSet<T>, что позволяет динамически создавать строго типизированную ссылку, но без использования строк. В случае добавления объекта в контекст, однако, я не знаю реального преимущества, за исключением того, что оно позволяет вам быть более последовательным в том, как вы ссылаетесь на свои сущности - вы читаете их из контекста, используя то же свойство (Context.Products) который вы используете, чтобы написать их.

 dotariel29 окт. 2010 г., 15:59
+1 за кампанию против магических струн
 Craig Stuntz11 мая 2010 г., 19:19
этоочень сильно Стоит прочитать файл codegen. Вы используете этот код все время, даже если вы не пишете его.
 4imble11 мая 2010 г., 18:17
Отлично. Большое спасибо за объяснение этого мне. Это оказалось намного проще, чем я себе представлял. Я действительно должен чаще проверять все эти сгенерированные файлы, чтобы лучше понять, что происходит за кулисами. Я сейчас посмотрю и посмотрю, что еще происходит!
 Roger Johansson11 мая 2010 г., 17:11
Наборы объектов кэшируются в генераторе кода по умолчанию. Так что я думаю, что есть небольшой выигрыш в использовании context.Products.Add, так как он сможет повторно использовать тот же набор без любых поисков.

Ваш ответ на вопрос