Anular SaveChanges de DbContext

Uso EF 4.3.1. Necesito agregar un valor predeterminado de una entidad al momento de guardar.

Por el momento estoy usando SaveChanges() y funciona.

Como se puede ver en el código que uso ChangeTracker.Entries<Option>() sin que importe Option representan un tipo de datos específico.

Me gustaría saber si es posible y cómo escribir una versión más genérica de ChangeTracker.Entries algo así como ChangeTracker.Entries<t>() para que pueda verificar todo tipo de entidades en mi modelo, como puede ver en mi caso específico, tengo una propiedad NoteInternal en muchas clases

      public override int SaveChanges()
    {
        #region Option BL
        var entities = ChangeTracker.Entries<Option>()
                                    .Where(e => e.State == EntityState.Added ||
                                                e.State == EntityState.Modified)
                                    .Select(e => e.Entity);
        // Add Default values when Creating or Editing an Entity
        string defaultvalue = "";
        foreach (var entity in entities)
        {
            if (String.IsNullOrWhiteSpace(entity.NoteInternal))
                entity.NoteInternal = defaultvalue;
        }
        #endregion

        return base.SaveChanges();
    }

Gracias por su ayuda!

PD: ¿tiene sentido usar el tipo de datos DINÁMICO aquí?

preguntado el 04 de julio de 12 a las 09:07

2 Respuestas

Puedo pensar en tres opciones:

  1. Utilice la reflexión para comprobar si cada elemento tiene un NoteInternal propiedad. Esto es lento.
  2. Utiliza dynamic para intentar acceder a la NotIntenral propiedad de cada elemento. Debe verificar y manejar la excepción lanzada cuando la entidad no tiene la propiedad.
  3. Crea una interfaz IHasNoteInternal que define la propiedad y que todas las entidades que tienen la propiedad implementen esa interfaz. A continuación, obtenga todas las entradas de IHasNoteInternal tipo.

Creo que la opción 3 es la mejor y ofrece el mejor diseño, pero requiere que cambie las entidades que pueden o no ser posibles. no se si se puede usar el generico Entries<TEntity>() método para obtener las entidades modificadas; es posible que no coincida con las entidades en función de una interfaz. En ese caso, utilice el no genérico Entries() y usa linq OfType<T>() operador para filtrar las entradas relevantes.

var hasNotInternal = ChangeTracker.Entries()
                     .Select(e => e.Entity).OfType<IHasNotInternal>();

Respondido 04 Jul 12, 10:07

¿podría proporcionarme una muestra de código para Entradas () y usar OfType de linq? () ???? - GibboK

¡Gracias, realmente lo aprecio! - GibboK

Haga que sus entradas hereden de una interfaz que implemente una propiedad NoteInternal.

crear una clase de extensión

public static class DbChangeTrackerExtensions {
public static IEnumerable<T> TypedEntries<T>(this DbChangeTracker tracker) {
  return tracker.Entries().OfType<T>();
}

Entonces puedes llamarlo pasando en esta interfaz.

O si no es posible cambiar las entidades

var name="NoteInternal";

var entities = ChangeTracker.Entries()  
                                .Where(e => e.State == EntityState.Added ||  
                                            e.State == EntityState.Modified)  
                                .Where(e => e.CurrentValues.Any(c=>c.Name==name && string.IsNullOrWhiteSpace((string)c.CurrentValue)));  
    // Add Default values when Creating or Editing an Entity  
    string defaultvalue = "";  
    foreach (var entity in entities)  
    {  
       entity.Property(name).CurrentValue=defaultvalue;
    }  

Respondido 04 Jul 12, 09:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.