En EF 4.0, si lo entiendo bien, hay dos tipos de valores en Entity: valores actuales y valores originales.
Podemos establecer los valores originales llamando al método ApplyOriginalValues (TEntity) pero ¿cómo obtener los valores originales?¿Cómo obtener los valores originales de una entidad en Entity Framework?
Respuesta
Se puede acceder a ellos a través de ObjectStateEntry
var originalValues = context
.ObjectStateManager.GetObjectStateEntry(myEntity).OriginalValues;
@Eranga respuesta no está actualizado para EF 5. Por alguna razón, EF 5 no funciona bien cuando conseguir valores originales utilizando una sentencia como esta:
var originalValues = context.Entry(myEntity).OriginalValues;
Mi solución de trabajo utiliza AsNoTracking()
método de DbSet
, como el siguiente ejemplo:
var originalEntity = context.MyEntities.AsNoTracking().FirstOrDefault(me => me.MyEntityID == myEntity.MyEntityID);
AsNoTracking() mejor rendimiento también - google it – Moji
¿Cómo obtener los valores modificados solamente? –
@AwaisMahmood Creo que esto merece una pregunta por separado. –
Esto podría ser refinado adicionalmente a lo siguiente:
var originalEntity = context.MyEntities.AsNoTracking()
.FirstOrDefault(me => me.MyEntityID == myEntity.MyEntityID);
El Where
en lo anterior, bueno, la respuesta no es necesaria.
Me encontré con un problema similar y AsNoTracking no era una opción para mi situación, así que se me ocurrió algo que funciona lo suficientemente bien para mí: primero "clonar" la entidad y luego hacer cambios.
public T Clone<T>(T entity)
where T : class, new() {
var clone = new T();
var properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy)
.Where(a => a.CanRead &&
a.CanWrite &&
a.GetMethod.IsFinal);
foreach (var property in properties) {
property.SetValue(clone, property.GetValue(entity));
}
return clone;
}
y luego compare el clon con el cambiado.
public string GenerateChangeText<T>(T original, T current)
where T : class, new() {
var properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy)
.Where(a => a.CanRead &&
a.CanWrite &&
a.GetMethod.IsFinal);
var changes = string.Empty;
foreach (var property in properties) {
var originalValue = property.GetValue(original);
var currentValue = property.GetValue(current);
if (originalValue == null && currentValue == null) continue;
if ((originalValue != null && !originalValue.Equals(currentValue)) ||
(currentValue != null && !currentValue.Equals(originalValue))) {
changes += $" changed {property} from {original ?? "NULL"} to {current ?? "NULL"}.";
}
}
return changes;
}
Existen algunas versiones de Entity Framework en uso.
yo prefiero Código primero y con esa API es fácil como
_context.Entry(Entity).Reload();
Los de más edad de la API tienen un método de actualización en el ObjectContext que puede ayudar en ciertos casos de uso
ObjectContext.Refresh(RefreshMode.StoreWins, Entity);
Documentos https://msdn.microsoft.com/en-us/library/bb896255(v=vs.110).aspx
Esta respuesta se refiere a Entity Framework 6. En EF 6 hay un valor original y valor actual https://msdn.microsoft.com/en-us/library/gg679512(v=vs.113).aspx Después de mirar y no encontrar una buena respuesta, se me ocurrió la siguiente función de prueba y pensé que la publicaría para otros que necesitaran hacer el mismo.
private void test()
{
// table has a field Description of type varchar(200)
WDMDBEntities context = new WDMDBEntities();
var query = context.Brands;
List<Brand> records = query.ToList();
if (records.Count > 0)
{
Brand currentRecord = records[0];
currentRecord.Description = "some new text";
string originalValue = null;
switch (context.Entry(currentRecord).State)
{
case System.Data.Entity.EntityState.Added:
originalValue = null;
break;
case System.Data.Entity.EntityState.Deleted:
case System.Data.Entity.EntityState.Detached:
case System.Data.Entity.EntityState.Modified:
case System.Data.Entity.EntityState.Unchanged:
originalValue = context.Entry(currentRecord).Property(u => u.Description).OriginalValue;
break;
}
}
context.Dispose();
}
- 1. ChangeTracker Entity Framework 4.1 - Los valores originales de los objetos relacionados con
- 2. ¿Cómo puedo obtener Id de entidad insertada en Entity framework?
- 3. ¿Cómo crear una entidad de solo lectura en Entity Framework?
- 4. Generación Entity Framework faltando una entidad
- 5. Entidad framework PostgreSQL
- 6. Extraña actualización de entidad en Entity Framework Code-First
- 7. Intercambio de valores con una restricción única en Entity Framework
- 8. ¿Cómo puedo obtener Id de la entidad insertada en Entity framework cuando uso defaultValue?
- 9. Entity Framework asigna múltiples tablas a una entidad
- 10. Cómo agregar entidad existente como una nueva entidad con Entity Framework
- 11. ¿Cómo obtener Entity Framework 4.2 sin Nuget?
- 12. Entity Framework no realiza un seguimiento de los cambios en la recopilación al reconectar una entidad
- 13. Entity framework y VARBINARY
- 14. Entity Framework en .NET?
- 15. Validación de Entity Framework
- 16. Entity Framework Thread Safety
- 17. Entity Framework 4 y valores predeterminados
- 18. Agregar o condición a la entidad en Entity Framework
- 19. proyecciones de Entity Framework
- 20. ¿Cómo deseo incluir con entusiasmo los elementos hijo y nieto de una entidad en Entity Framework Code First?
- 21. de paginación en Entity Framework
- 22. ¿Cómo elimino una entidad hija de una colección principal con Entity Framework 4?
- 23. Obteniendo ID de la entidad creada recientemente - ADO Entity Framework
- 24. Cómo revertir una transacción en Entity Framework
- 25. ¿Cómo se actualiza automáticamente la propiedad modificada en una entidad en Entity Framework 4 al guardar?
- 26. Cómo controlar los valores de clave principal cuando la siembra de datos con Entity Framework codefirst
- 27. Cómo obtener los datos originales de Python de QVariant
- 28. Entity Framework - Obtener lista de tablas
- 29. Entidad Framework 4.1 - Override Entity (DBSet) con Filter
- 30. ¿Cómo obtener un repositorio de una entidad?
originalValues es el tipo DbDataRecord. ¿Cómo convertirlo a tipo de entidad? – JatSing
@Sun no tiene tipos de entidad. Necesita convertir los valores al tipo apropiado. ej. 'var name = (string) originalValues [" Name "];' – Eranga