EF 4.1 Quick Tip: Add/Attach Returns Your Entity

We did a few things in EF 4.1 that were not at all ground-breaking or cool or anything like that, but were intended only to make programming a little bit more pleasant. One of those was making the Add and Attach methods return a reference to the added or attached entity.

This is nice because it can sometimes save a local variable or a line or two of code and thereby make your code easier to read.  For example, in a little test app I was just working on I wanted to create a new “Doc” entity, add it to the context, then use it later in the same method.  Instead of writing:

var doc = new Doc();
context.Docs.Add(doc);

I was able to write this:

var doc = context.Docs.Add(new Doc());

Another advantage of returning the added entity is that it allows the Add/Attach methods to be more composeable. For example, later in the same method I had some code that attempted to find an entity in the context and, if the entity was not found, created a new one and added that new entity to the context. Instead of writing:

var word = context.ChangeTracker.Entries<Word>()
                                .Select(e => e.Entity)
                                .SingleOrDefault(w => w.TheWord == theWord);
if (word == null)
{
    word = new Word { TheWord = theWord };
    context.Words.Add(word);
}

I was able to use a more functional approach:

var word = context.ChangeTracker.Entries<Word>()
                                .Select(e => e.Entity)
                                .SingleOrDefault(w => w.TheWord == theWord)
    ?? context.Words.Add(new Word { TheWord = theWord });

Hopefully once in a while you can use the return value from Add or Attach and be just a little bit happier because of it. :-)

Thanks for reading!

Arthur

Advertisements

4 comments on “EF 4.1 Quick Tip: Add/Attach Returns Your Entity

  1. Matt says:

    Hey Arthur, nice post! I will definitely use this.

    Do you know if EF will support SQL Azure retry logic any time soon? It’s a real pain to have to wrap every query with the SQL Azure retry logic (see this post: http://blogs.msdn.com/b/appfabriccat/archive/2010/12/11/sql-azure-and-entity-framework-connection-fault-handling.aspx)

    It seems to me, if we could just add a “IsSqlAzure=true” to the connection string, and have EF take care of the rest, it would be great!!!

    Thanks,
    Matt

    • @Matt I know a couple of people have been looking into this but I’m not sure where things have landed. I’ll try to get some more info for you next week.

      Thanks,
      Arthur

      • Matt says:

        Thanks Arthur. Any help here is much appreciated! If it helps, the article I linked to has this at the bottom:

        Authored By: James Podgorski
        Review By: Valery Mizonov, Mark Simms, Faisal Mohamood

      • @Matt The SQLClient team recently released an update that fixes the connection pooling issue–see this . There isn’t currently any code being added to EF to do automatic retries at the EF level. More work may be done on this in the future.

        Thanks,
        Arthur

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s