2011-08-09 10 views
23

Estoy tratando de recibir una entidad y luego actualizarla, pero quiero obtenerla sin seguimiento, así que puedo adjuntarla de nuevo al contexto.Desactivar el seguimiento en el modelo de estructura de entidad primero

Tengo el EntityFramework.dll al que se hace referencia (4.1). Genere la base de datos del modelo. (no código primero).

Get usuario:

db.Users.MergeOption = MergeOption.NoTracking; 
IQueryable<User> query = db.Users;//.AsNoTracking(); //<-- apparently, this is code-first only. 

return query; 

actualización Valoración:

db.Users.Attach(user); //error here. 
ObjectStateEntry entry = db.ObjectStateManager.GetObjectStateEntry(user); 
entry.SetModifiedProperty(propertyName); 
db.SaveChanges(); 
return user; 

error:

An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key.

que llamo el método como este:

var user = userRepository.GetUsers().FirstOrDefault(u => u.UserId == userId); 
user.Identifiers.Add(someIdent); 
userRepository.UpdateUser(user); 
+0

Debería funcionar. ¿Estás seguro de que no estás recibiendo usuario con otra consulta? –

+0

@Ladislav misma consulta. Solo tengo 1 método de lectura/obtención en el repositorio, que usa ese código –

+0

Acabo de probar un código similar sin toda la carga del repositorio y funciona para mí. –

Respuesta

7

En lugar de separar y unir. Si desea manejar la actualización de un elemento que puede o no ser del contexto original, podría hacer lo siguiente.

var originalItem = db.Users.Find(user.UserId); 
db.Entry(originalItem).CurrentValues.SetValues(user); 
db.SaveChanges(); 
+3

Esto no parece funcionar para mí cuando mi objeto (originalItem) tiene una propiedad que es una colección de entidades secundarias. ¿Hay algo especial que deba hacer en este caso? –

17

n de seguimiento de consultas A veces es posible que desee consultar a las entidades, pero no tienen las entidades ser rastreados por el contexto. Esto puede dar como resultado un mejor rendimiento al consultar un gran número de entidades en escenarios de solo lectura. El método de extensión AsNoTracking ejecuta una consulta y devuelve los resultados sin rastrearlos en el contexto. En el siguiente ejemplo, las consultas devolverán objetos pero el contexto no los rastreará. otro

 // Query for all departments without tracking them 
     var departments1 = context.Departments.AsNoTracking().ToList(); 

     // Query for some departments without tracking them 
     var departments2 = context.Departments 
       .Where(d => d.Name.StartsWith("math")) 
       .AsNoTracking() 
       .ToList(); 
+0

fuente de cotización: https://msdn.microsoft.com/en-us/data/jj556203.aspx –

Cuestiones relacionadas