2009-07-31 19 views
6

¿Alguien me puede decir si/cómo puede validar los cambios en un contexto de datos en Linq2Sql antes de llamando a SubmitChanges(). La situación que tengo es que creo un contexto, realizo múltiples operaciones y agrego muchas inserciones junto con otras tareas de procesamiento y luego retrotrajo si el envío falla.Validar Linq2Sql antes de SubmitChanges()

Lo que prefiero hacer es realizar una especie de llamada "Validar()" después de realizar ciertas tareas para poder manejarlo antes de enviar el trabajo completo.

Respuesta

6

para obtener todos los cambios en un contexto de datos que puede llamar

ChangeSet changes = dataContext.GetChangeSet(); 

// An IList<Object> 
changes.Deletes; 
changes.Inserts; 
changes.Updates; 

Lo que tengo es cada objeto tiene un valor método de validación. Uso los atributos para definir diferentes tipos de validación. La razón por la que lo hago manualmente es porque tengo un número que tal vez un int en la base de datos y el código, un valor de 1002 podría ser inválido si guardo una edad. Entonces puedo dar un rango de valores, etc. .

Si cada uno de sus objetos de valor hereda de un objeto base, los iterará más fácilmente. Suponiendo que tiene en su clase base un método Validate.

Me gustaría señalar que para que funcione, tendrá que editar el código generado o hacer rodar sus propios objetos de valor. Por lo general, transfiero el mío debido a cómo los uso para la validación.

+0

no se dio cuenta del .GetChangeSet() método antes! ¡Gracias por eso! +1 – StevenMcD

+0

El enfoque real al que terminé fue crear una clase parcial con el nombre de la tabla e implementar el código de validación en OnFooChanging() para los campos que quería validar. Funciona para lanzar excepciones inmediatamente cuando se establece el valor en lugar de en SubmitChanges(). No usé ChangeSet, pero me indicó la dirección correcta y es útil saberlo de todos modos. –

+0

@Nick - Me siento inútil diciéndote esto porque no recuerdo el blog donde lo leí, pero aparentemente es una buena idea mantener la validación separada de los manejadores "OnChange", ya que permite complejos escenarios de validación, donde la validación de una propiedad depende del valor de otras, etc. – Mark

5

También puede usar la función OnValidate() con la clase parcial de la entidad LINQ-to-SQL. OnValidate() se llamará durante SubmitChanges() pero antes de que los datos se envíen a la base de datos. Una cosa agradable con OnValidate() es que puede diferenciar entre la acción CRUD por la enumeración ChangeAction.

Por ejemplo,

public partial class YourEntity 
{ 
    partial void OnValidate(System.Data.Linq.ChangeAction action) 
    { 
     if(action == System.Data.Linq.ChangeAction.Insert) 
      // Do insert 
     ... etc. ... 
    } 
} 
Cuestiones relacionadas