Es posible consultar Entity Framework antes de llamar a DbContext.¿SaveChanges?


En este simple ejemplo, tengo dos entidades: Event y Address. Tengo una aplicación de consola que se ejecuta todas las noches para importar datos de eventos de una fuente XML y agregarlos a mi base de datos.

Al recorrer los nodos de eventos XML (dentro del contexto Entity Framework), compruebo si hay un registro de direcciones con los valores dados ya en la base de datos. Si no, agrega un nuevo registro.

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

Sé que es un rendimiento más lento llamar a contexto.SaveChanges () después de cada evento, así que me gustaría hacer todo esto al final (o hacerlo en lotes, pero eso no es relevante para este problema). Sin embargo, cuando hago una consulta contra el contexto.Direcciones, no parece ser consciente de ninguna dirección nueva hasta después de llamar a contexto.SaveChanges () así que obtengo registros duplicados.

Para mis propósitos, puede estar bien guardar después de cada registro en lugar de al final, pero me gustaría saber si hay una buena alternativa simple.

Author: JKasper11, 2013-09-20

2 answers

Cuando realiza una consulta de manera que se toque la base de datos, las entidades recién agregadas en el contexto no se incluyen en el resultado. En EF 4.1 puede obtenerlos a través de DbSet<T>.Local

Véase:

Por qué las consultas de Entity Framework no devuelven entidades no guardadas

Y

Entity Framework: Re-encontrar objetos añadidos recientemente a context

 23
Author: Alireza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:31:16

La consulta directamente contra un DbSet siempre enviará una consulta a la base de datos. Existe una buena alternativa en Entity Framework 5-DbSet.Propiedad local que le permite trabajar con datos en memoria (creados por usted mismo o cargados desde la base de datos).

Mira este artículo: http://msdn.microsoft.com/en-us/data/jj592872.aspx.

 1
Author: Eugene Griaznov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-13 15:03:19