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?
Respuesta
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.
bummer ......... –
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
@BenSwayne: Sí. Eso debe ser marcado como una respuesta. –
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 ....
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
@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
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
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
(arriba está en EF6) – Josh
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
- 1. ExecuteStoreQuery con Dbcontext
- 2. Multiple DbContext, multiple Database.SetInitializer
- 3. DbContext y RejectChanges
- 4. Caché interna de DbContext (?)
- 5. DbContext no compilando?
- 6. EF DbContext y StructureMap alcance
- 7. Uso de ObjectContext y DbContext
- 8. Entity Framework IValidatableObject reference DbContext
- 9. Acceda a DbContext desde IQueryable
- 10. DbContext ChangeTracking mata el rendimiento?
- 11. ¿Por qué mi DbContext DbSet es nulo?
- 12. ¿DbContext es lo mismo que DataContext?
- 13. Usar EF4 DbContext con servicio de dominio
- 14. EF 4.1 - DBContext SqlQuery e Include
- 15. DbContext SaveChanges Order of Statement Execution
- 16. DbContext bloquea con PrimitiveType = error nula
- 17. Ejecución de procedimientos almacenados desde un DbContext
- 18. entidad marco 4.1 ObjectContext vs dbContext
- 19. Creando un EF CodeFirst DbContext usando Roslyn
- 20. Cambios de carga realizados en otro DbContext
- 21. 'ObjectContext' vs 'DbContext' en Entity Framework
- 22. Código EF First DBContext and Transactions
- 23. Campo estático de DbContext en Global.asax frente al campo de instancia de DbContext en la clase de controlador?
- 24. Entidad Framework 4: Evento ObjectContext al guardar con éxito
- 25. Entity Framework no puede usar DbContext, modelo creado
- 26. ¿Puede un DbContext aplicar una política de filtro?
- 27. Referencias para DBContext, DBSet <> en Entity Framework
- 28. DbContext no mantendrá abierta la conexión para su reutilización
- 29. código EF primera: dbcontext heredado crea dos bases de datos
- 30. ¿Cuál es el equivalente de ObjectContext.ApplyCurrentValues para DbContext
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. –