2011-03-23 15 views
7

EF 4.1 RC. Quiero ejecutar algún código después de que se haya agregado/adjuntado una entidad al DBContext. ¿Hay algún evento para esto? No puedo encontrar ninguno. Básicamente, quiero verificar si la entidad agregada/adjunta es de cierta interfaz y, si lo es, hacer algunas cosas con ella. Gracias!DBContext Evento agregado/adjunto?

+0

Como dijo Ladislav, no hay extensibilidad. Si está buscando algo más poderoso (y no mucho más complicado, si está dispuesto a aprender), recomiendo NHibernate. Hace lo que quieres y más. –

Respuesta

11

Desafortunadamente, no hay tales eventos disponibles y no hay puntos de extensión para agregar tales eventos. Esa es, en mi opinión, una de las mayores fallas de EF. La extensibilidad = cero.

La única cosa que puede hacer es anular SaveChanges y antes de ejecutar base.SaveChanges uso ChangeTracker para obtener todas las entidades adscritas y añadidos de su tipo y ejecutar su lógica. Pero no es lo mismo que desencadenar un evento al adjuntar o agregar una entidad al contexto.

+0

bummer ......... –

+0

No estoy probando contra v 4.1 como se indicó en la pregunta original, pero la respuesta de @KVerwold está muy bien a continuación. Acabo de probar el uso del ObjectStateManager en EF5 y funciona muy bien. – BenSwayne

+0

@BenSwayne: Sí. Eso debe ser marcado como una respuesta. –

19

Para realizar un seguimiento de los cambios en el contexto, puede utilizar el evento ObjectStateManagerChanged del ObjectStateManager. Para acceder a la ObjectStateManager, usted tiene que utilizar el IObjectContextAdapter para la fundición de la DbContext como

var contextAdapter = ((IObjectContextAdapter)dbcontext);    
contextAdapter.ObjectContext 
       .ObjectStateManager 
       .ObjectStateManagerChanged += ObjectStateManagerChanged; 

Una vez que tienes el evento, se dispara cada vez que se cambia la colección añadiendo o eliminando entidades a la ObjectStateManager. Para rastrear el estado de la entidad, use GetObjectStateEntry() del ObjectStateManager y use el Element del parámetro CollectionChangeEventArgs.

La combinación de ambos estados de CollectionChangeEventArgs y ObjectStateEntry puede realizar un seguimiento, lo que está pasando ....

+0

Parece agradable, sin embargo en mis pruebas, ObjectStateManagerChanged en realidad se llama _antes_ de que todo se guarde en la base de datos (se emite cuando se llama a Add()), y Obviamente se llama a ObjectContext.SavingChanges antes de guardar también. No he encontrado nada que se llame _después_ los cambios se guardan ... (en EF6) – Josh

+0

@Josh, que es una razón para proporcionar su propio correo electrónico. Contenedor de "unidad de trabajo" alrededor de EF: le permite administrar cuándo se llama a los cambios de guardado, frente a cuando se invoca el compromiso (si ha abierto su propia transacción). Sin embargo, para mis circunstancias, el gerente de estado cambiado busca proporcionar exactamente lo que necesito. – Nathan

4

controlar el evento CollectionChanged por la propiedad local del DbSet relevante (ObservableCollection).

Compruebe el estado de DbEntityEntry del objeto de entidad añadido/adjunto para agregar o sin modificar para agregar/adjuntar, respectivamente.

propiedad DbSet.Local: http://msdn.microsoft.com/en-us/library/gg696248(v=vs.103).aspx

método DbContext.Entry: http://msdn.microsoft.com/en-us/library/gg696578(v=vs.103).aspx

+0

Tenga en cuenta que esto funciona y que hubiera sido un método excelente de usar, sin embargo, emite el evento antes de que la entidad se guarde en la base de datos, por lo que podría desencadenar un "falso positivo" si algo no funciona. – Josh

+0

(arriba está en EF6) – Josh

+0

La pregunta sobre el procesamiento de entidades de cierto tipo después de que se agregaron/se adjuntaron al 'DbContext'. Si desea realizar un procesamiento posterior después de que las entidades se guardan en la base de datos con éxito, anule el método 'DbContext.SaveChanges' e implemente su lógica después de llamar al método' base.SaveChanges'. – Moho

Cuestiones relacionadas