Im utilizando EF4 en VS2010, POCO y el primer enfoque del modelo.¿Cómo se actualiza automáticamente la propiedad modificada en una entidad en Entity Framework 4 al guardar?
Mi entidad tiene las siguientes propiedades: Id: Guid, Nombre: String, Creado: DateTime, Modificado: DateTime, Revisión: Int32.
Creo mi entidad, establezco el nombre y lo guardo en la base de datos utilizando el contexto EF4. Esto debería establecer Id en un nuevo Guid (funciona con Identity-SGP), Creado establecido ahora, Modificado a la izquierda como nulo, Revisión a 0. Recupero la entidad, cambio el nombre y lo guardo de nuevo. Esta vez, el valor modificado debe establecerse ahora y la revisión debe ser 1.
¿Cómo puedo lograr esto utilizando EF4 con el diseñador EDMX?
Actualización:
Esto fue lo que terminó usando:
public override int SaveChanges(System.Data.Objects.SaveOptions options)
{
foreach (ObjectStateEntry entry in ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified).Where(e => e.Entity is EntityBase))
{
EntityBase entity = entry.Entity as EntityBase;
if (entry.State == EntityState.Added)
{
entity.Version = new Version() { Major = 1, Minor = 0, Revision = 0 };
entity.Created = DateTime.Now;
if (OperationContext.Current != null) entity.CreatedBy = OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Name;
}
else if (entry.State == EntityState.Modified)
{
entity.Version.Revision++;
entity.Modified = DateTime.Now;
if (OperationContext.Current != null) entity.ModifiedBy = OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Name;
}
}
return base.SaveChanges(options);
}
que tampoco funciona ... :(
El problema es que el entry.State todavía no modificada incluso si ejecuto explícitamente el método MarkAsModified(). No lo consigo ...
¿Por qué el seguimiento de cambios no está habilitado de manera predeterminada? Por ejemplo, ¿por qué me gustaría tenerlas y volver a activarlas explícitamente? ¿Y por qué persisten las entidades para db incluso si el estado no está modificado? ¿Y cuál es la diferencia entre EntityState y ObjectState? Por el momento estoy haciendo todos los cambios y actualizaciones en el servidor, pero también usaré un servicio WCF para transferir entidades de un lado a otro más adelante ... ¿Hay alguna diferencia en cómo se tratan los cambios aquí? Si todos los cambios en el servidor, sin importar el cambio de seguimiento activado/desactivado, persisten? Lo que quiero es que nunca se pueda almacenar nada sin actualizar también Modified, Revision, etc. Estas propiedades siempre deben establecerse en el servidor cuando el objeto se recibe y ha cambiado. (No estoy hablando-del lado del servidor SQL aquí, pero el servicio del lado del servidor)
Gracias Lo intentaré, pero ¿hay alguna forma de hacerlo en el servidor sql en la actualización? –
Por supuesto, puede escribir un "disparador" de base de datos que actualice la tabla al insertar y actualizar. Esta es una solución para hacerlo en el lado del cliente con el marco de la entidad. –
He intentado con su método, pero estoy teniendo problemas para establecer una propiedad int dentro de una propiedad ComplexType en la entidad actualizada. Tengo una versión de ComplexType con tres entradas y solo quiero actualizar el último valor. Establecer una nueva versión falla completamente con una excepción que me dice que tengo que implementar IExtendedDataRecord. ¿Es eso realmente necesario? –