2009-08-03 26 views
7

encontré an MSDN article que describe cómo maneja EF concurrencia al guardar cambios:concurrencia optimista en ADO.NET Entity Framework

Por defecto [...] Servicios de objeto ahorra objeto cambios en la base de datos sin comprobación para concurrencia. Para propiedades que podrían experimentar un alto grado de concurrencia, que recomendamos que la propiedad de entidad sea definido en la capa conceptual con un atributo de ConcurrencyMode = "fijo"

Tengo dos preguntas:

  1. al no tener propiedades en mi modelo en el que ConcurrencyMode="fixed", ¿es seguro para mí asumir que si alguna vez un OptimisticConcurrencyException se lanza al guardar los cambios, es porque exis la entidad ya no ts en el almacén de datos, es decir, ha sido eliminado por otro usuario o me falta algo?

    imagino EF ejecución de una -statement UPDATE que se ve algo como esto, que, como yo lo veo, sólo causará un OptimisticConcurrencyException a ser lanzado si la persona con ID = 1 no existe:

    UPDATE Person SET FirstName = 'John' AND LastName = 'Smith' WHERE ID = 1 
    
  2. Cuando usa ConcurrencyMode="fixed", ¿EF comprueba la concurrencia al eliminar entidades también? En otras palabras, se EF jamás ejecutar un -statement DELETE que tiene este aspecto (con algo más que la clave principal en el WHERE -clause):

    DELETE FROM Person WHERE ID = 1 AND LastName = 'Doe' 
    

Respuesta

6

Buena pregunta.

(1) Sí, pero desafortunadamente no es así de simple. Debido a que EF (3.5) tiene un modelo de asociación independiente, la asociación también se trata de manera independiente, y aunque no lo haya dicho, se convierte en parte de las comprobaciones de concurrencia durante ACTUALIZACIONES y SUPRIMACIONES.

es decir, cuando se actualiza una persona que a menudo ver las actualizaciones que se ven así:

UPDATE Person SET Partner = NULL AND FirstName = 'John' AND LastName = 'Smith' 
WHERE ID = 1 AND Partner = 2 

es decir, la pareja es una columna FK.

Todo esto cambia en 4.0 si usa asociaciones FK, como esperamos la mayoría de la gente también.

(2) Para BORRAR cualquier ConcurrencyMode = propiedades 'fija' SON marcadas durante la eliminación. La excepción es cuando tiene un SPROC para eliminar que no acepta los valores de Concurrencia.

Esperanza esto ayuda

Alex

+0

Buena respuesta. Esta fue _exactamente_ la información que estaba buscando. ¡Gracias un montón! – bernhof

Cuestiones relacionadas