views:

107

answers:

1

Reading this MSDN article titled "Working with ObjectSet (Entity Framework)" It shows two examples on how to add a Product.. one for 3.5 and another for 4.0.

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

Through my lack of knowledge I am possibly completely missing something here, but i never added a Product like this:

   //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);
   }

I would not have done it either way and just used:

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

What's the difference between these three ways?

Is "My way" just another way of using an ObjectQuery?

Thanks, Kohan

+7  A: 

All of them do the same thing, with minor differences in syntax.

First, let's look at the 3.5 way and "your way." If you look at the codegen file for your EDMX, you'll see something like:

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

So these two methods are exactly the same, except that the magic string in your code is replaced by a codegened version which can never be wrong.

The ".NET 4 way" does the same thing, but does it differently. It uses the strongly typed ObjectSet<T>, which allows you to create a strongly-typed reference dynamically but without using strings. In the case of adding an object to a context, though, there's not a real advantage that I know of, except that it allows you to be more consistent about how you reference your entities -- you read them from the context using the same property (Context.Products) which you use to write them.

Craig Stuntz
The ObjectSets are cached in the default code generator.So I guess there is some slight perf gain to use context.Products.Add since it will be able to reuse the same set w/o any lookups.
Roger Alsing
Excellent. Many thanks for explaining this to me. It turned out to be much simpler than I had imagined. I really should dig into an check out all these generated files more often for a better understanding of what goes on behind the scenes. I'll have a look now and see what other things are going on!
Kohan
It is *very much* worth reading the codegen file. You use this code all the time, even though you don't write it.
Craig Stuntz
+1 for campaigning against magical strings
XSaint32