update transaction framework attach c# entity-framework entity-framework-5 dbcontext savechanges

c# - transaction - ¿Es posible consultar Entity Framework antes de llamar a DbContext.SaveChanges?



transaction entity framework 5 (2)

Al consultar de una manera que la base de datos se toca, a continuación, las entidades recién añadidos en el contexto no se incluyen en el resultado. En EF 4.1 puedes obtenerlos a través de DbSet<T>.Local

Ver :

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

Y

Entity Framework: volver a encontrar objetos recientemente agregados al contexto

En este ejemplo simple, tengo dos entidades: Evento y Dirección. 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.

Mientras recorro los nodos de eventos XML (dentro del contexto de Entity Framework), verifico si hay un registro de dirección con los valores dados ya en la base de datos. Si no, agrega un nuevo récord.

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 context.SaveChanges () después de cada evento, así que me gustaría hacerlo todo al final (o hacerlo en lotes, pero eso no es relevante para este problema). Sin embargo, cuando hago consultas en contra de context.Addresses, no parece estar al tanto de ninguna dirección nueva hasta después de llamar a context.SaveChanges () para obtener 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 alternativa buena y simple.


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

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