Is it possible to query Entity Framework before calling DbContext.SaveChanges?

16,480

Solution 1

When you query in a way that the database is touched, then the newly added entities in the context are not included in the result. In EF 4.1 you can get them via DbSet<T>.Local

See :

Why do Entity Framework queries not return unsaved entities

And

Entity Framework: Re-finding objects recently added to context

Solution 2

Query directly against a DbSet will always send a query to the database. There is a good alternative in Entity Framework 5 – DbSet.Local property that let you work with in-memory data (created by yourself or loaded from database).

Look this article: http://msdn.microsoft.com/en-us/data/jj592872.aspx.

Share:
16,480
JKasper11
Author by

JKasper11

Updated on June 06, 2022

Comments

  • JKasper11
    JKasper11 almost 2 years

    In this simple example, I have two entities: Event and Address. I have a console application running every night to import event data from an XML source and add it to my database.

    As I loop through the XML event nodes (inside of the Entity Framework context), I check to see if there is an address record with the given values already in the database. If not, it adds a new record.

    using (DemoContext context = new DemoContext())
    {
        foreach (XmlNode eventNode in eventsXml.SelectNodes("/Events/Event"))
        {
            Event newEvent = new Event();
    
            newEvent.Title = **get from XML**
    
            Address address = context.Addresses.Where(a =>
                a.Title.Equals(title, StringComparison.OrdinalIgnoreCase) &&
                a.Address1.Equals(address1, StringComparison.OrdinalIgnoreCase) &&
                a.Address2.Equals(address2, StringComparison.OrdinalIgnoreCase) &&
                a.City.Equals(city, StringComparison.OrdinalIgnoreCase) &&
                a.State.Equals(state, StringComparison.OrdinalIgnoreCase) &&
                a.ZipCode.Equals(zipCode, StringComparison.OrdinalIgnoreCase)
            ).FirstOrDefault();
    
            if (address != null)
                newEvent.Location = address;
            else
            {
                newEvent.Location.Title = title;
                newEvent.Location.Address1 = address1;
                newEvent.Location.Address2 = address2;
                newEvent.Location.City = city;
                newEvent.Location.State = state;
                newEvent.Location.ZipCode = zipCode;
            }
    
            context.Events.Add(newEvent);
        }
    
        context.SaveChanges();
    }
    

    I know it is slower performance to call context.SaveChanges() after every event, so I would like to do this all at the end (or do it in batches but that's not relevant to this problem). However, when I query against context.Addresses, it doesn't seem to be aware of any new addresses until after I call context.SaveChanges() so I get duplicate records.

    For my purposes it may be okay to save after each record rather than at the end, but I would like to know if there is a good, simple alternative.