Pregunta

He estado mirando algunos ganchos de auditoría con Entity Framework. Muchos de ellos muestran comparaciones viejo / nuevo valor. Esto hace grande para una pista de auditoría pero estoy buscando a una instantánea objetos.

Por ejemplo ... Digamos que tengo una aplicación que gestiona los productos. Un producto tiene múltiples atributos y otros objetos asociados. Digamos que cambiar un objeto 10 veces. Supongamos también que es importante que puedo ver las pantallas de los cambios de objeto (no una pista de auditoría, pero lo que la pantalla de realidad parecía en un único formato de lectura). Lo que me interesa es ser capaz de recuperar el objeto original del producto EF (con todos los datos asociados) para todos los 10 de esos cambios (dependiendo de que quiero ver) y el uso que se una a mi pantalla.

Si estoy usando SQL Server, qué tipo debo usar para el objeto serializado en la actualidad (XML, gota, etc.)? ¿Tiene sentido hacer esto?

¿Fue útil?

Solución

Vamos a ver. Usted tiene la obligación de tener un gráfico de objetos y serializar en la base de datos en un formato que le permitirá materializar más adelante. Creo que hay herramientas que hacen exactamente esto. Uno de ellos, se me ocurre, es el marco de la entidad.

Lo que se quiere hacer es una cosa muy común. Considere un motor de wiki. El wiki debe tener una revisión de punta que todo el mundo ve, además de las revisiones posteriores de cada documento. El wiki también tiene que ser capaz de mostrar una revisión de vuelta en la misma forma en que se muestra una revisión de punta. Por lo tanto, el mismo formato de almacenamiento se debe utilizar para los dos.

Yo propondría que permite que todos sus tipos de entidad esté versionado. Al editar un tipo de entidad, editará la revisión de punta y almacenar una revisión posterior que contiene los valores anteriores. (La razón por la que edita la revisión de punta en lugar de insertar una nueva punta se debe a otros objetos, que actualmente no están materializados en un ObjectContext, pueden contener enlaces a la punta que le gustaría conservar como enlaces a la punta, en lugar de enlaces a la revisión posterior.)

Si es necesario, puede crear particiones en tablas de SQL Server de modo que las revisiones de espalda se almacenan en un grupo de archivos diferente. Esto le permitiría a las revisiones de copia de seguridad de punta y revisiones de espalda por separado.

Otros consejos

En primer lugar es necesario agregar un conjunto de propiedades a las tablas:

  • Versión -. El tiempo de la última modificación (también se puede autoincremental contador en lugar de tiempo)
  • lastModifiedBy -. De referencia para el usuario que hizo la última modificación (si se almacenan los que)

A continuación, usted tiene varias opciones sobre cómo almacenar el historial de versiones. Usted puede

  1. Crea una nueva tabla para cada una de las tablas principales que desea almacenar la historia de. Que las tablas de la historia tendrán todos los mismos campos que la tabla principal, pero las claves primarias y externas no se harán cumplir. Para cada clave externa también almacén de versiones de entrada hace referencia a la versión de tiempo se ha creado.

  2. O puede serializar todo lo interesante acerca de su entidad y almacenar todo lo que manchas en serie para todas las entidades que desea la versión en una tabla de historia mundial (yo personalmente prefiero primera aproximación).

¿Cómo surtir sus tablas de la historia? Via actualizar y eliminar los factores desencadenantes.

  • En activador de actualización para su entidad - copia todos los valores anteriores a la tabla de historial. Para cada clave externa - también copiar la versión actual de la entidad de referencia
  • .
  • En desencadenador de eliminación - básicamente lo mismo
  • .

Tenga en cuenta que cada vez más los sistemas modernos realmente no borrar nada. Ellos simplemente marca cosas como eliminado. Si usted quiere seguir este patrón (que tiene varios beneficios.) - en lugar de eliminar agregar el indicador de IsDeleted a sus entidades (por supuesto usted entonces tiene que filtrar las entidades eliminadas por todas partes)

¿Qué opina de su historia? Sólo tiene que utilizar tabla de historia, ya que tiene todas las mismas propiedades que la mesa principal - no debería ser un problema. Pero - al ampliar las claves externas - asegurarse de que la entidad referenciada versiones es el mismo que se almacenan en la tabla de la historia. Si no es así - que necesita para ir a la tabla de historia de esa entidad y los valores de agarre que se hace referencia allí. De esta manera usted siempre tendrá una instantánea de cómo la entidad se parecía en ese momento, incluyendo todas las referencias.

Además de todo lo anterior - también se puede restaurar el estado de su entidad a cualquier versión anterior.

Tenga en cuenta que esta implementación, mientras que fácil, puede consumir un poco de espacio, ya que almacena , no sólo que se realicen cambios instantánea. Si sólo quiere guardar los cambios - en la actualización de disparo se puede detectar qué campos se ha cambiado, serializarlos y almacenar en la tabla historia global. De esa manera se puede mostrar por lo menos en la interfaz de usuario lo que se ha cambiado y por quién (aunque es posible que tenga dificultades volver a una versión anterior).

En un proyecto recientemente he construido utilizamos nos metimos en el método SaveChanges en la clase DbContext. Esto nos dio acceso a una instancia de la clase ChangeTracker. Llamando ChangeTracker.Entries() le da acceso a una lista de DbEntityEntry. DbEntityEntry tiene las siguientes propiedades y métodos interesantes:

  • State - se elimina el objeto recién creado, modificado o
  • Entity - una copia del objeto tal y como está
  • CurrentValues - una enumeración de la valorado
  • editado
  • OriginalValues - una enumeración de los valores originales

Hemos creado un conjunto de Pocos de conjuntos de cambios y cambios que entonces podríamos acceder a través de EF. Esto permitió a los usuarios ver los cambios de nivel de campo junto con las fechas y los usuarios responsables.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top