Sto cercando una soluzione per eseguire alcune convalide di entità personalizzate (che richiederebbero l'accesso al database, la convalida del membro trasversale ...) quando l'utente salva le sue modifiche in una schermata di dati dinamici, con Entity Framework.
La convalida è più complessa di quello che posso fare con gli attributi (richiede un accesso al database, ecc.)Convalida dell'entità avanzata personalizzata con dati dinamici
È possibile intercettare la chiamata di SaveChanges?
Ho tentato di ignorare ValidateEntity
nell'oggetto DbContext, ma i dati dinamici non sembrano chiamarlo (probabilmente perché sta utilizzando l'ObjectContext interno, non sono sicuro del perché), e l'annullamento di SaveChanges non aiuta neanche.
Non vedo comunque che potrei sottoscrivere ...
Il documentation dovrebbe aiutare:
convalida Personalizza per un individuo campo di dati sovrascrivendo il metodo OnValidate o la gestione dell'evento Convalida , che vengono invocati quando viene modificato un campo dati. Questo approccio consente di aggiungere la convalida e la logica aziendale per un singolo campo. Questo approccio è più generale di rispetto all'aggiunta della convalida per un singolo campo. È utile quando la stessa logica di convalida può essere applicata a più di un campo di dati. Consente inoltre di eseguire controlli di convalida che coinvolgono più campi .
Ma io sto usando POCO Entity Framework 6 classi in modo non c'è nessun metodo OnValidate
per ignorare, e da quello che ho letto questo è per LinqToSql, e non riesco a trovare l'evento Validate
fanno menzione.
ho cercato di iscriversi al SavingChanges
caso di interno ObjectContext
nel costruttore della mia DbContext, chiamare manualmente il ValidateEntity
, ma non so cosa fare con il risultato. Se lancio uno DbEntityValidationException
(o uno ValidationException
come suggerito in this article), ASPNET lo gestisce come qualsiasi eccezione (schermo giallo).
L'implementazione di IValidatableObject
non funziona.
Ho anche provato attuazione mia DynamicValidator
per vedere cosa succede, ma senza successo, sembra per gestire l'eccezione (se sovrascrivo ValidateException
, e mettere un punto di interruzione, lo vedo), ma è ancora gorgogliare fino al default gestore degli errori e visualizza una schermata gialla. Devo mancare qualcosa.
Quindi, come eseguire la convalida complessa (cross-field, con query, ecc.) Sulle entità prima di salvare in Dynamic Data/EF?
sono d'accordo con questa affermazione, ho anche credere che la logica di business non deve essere accoppiato con Entity Framework – Eldho
E 'discutibile. Forse un oggetto del dominio può invece avere la validazione. Finché non viene usato il terribile pattern "repository layer before EF" ... – James
Sono d'accordo, ma Dynamic Data non offre molte opzioni per la convalida. Ma il problema non c'è, il problema è che DbValidationException non viene catturato da DynamicValidator (anche se i documenti e gli articoli che trovo dicono che dovrebbe) così ottengo una schermata gialla. In questo momento non sto nemmeno cercando di avere una buona architettura, solo per avere qualcosa che funzioni :(. –