Ho la seguente regola di convalida remota:
[AcceptVerbs("Get", "Post")]
public IActionResult ValidateWindowEndDate(DateTime? endDate, DateTime? startDate)
{
int minWeeks = 8;
if (startDate.HasValue && endDate.HasValue
&& (endDate < startDate.Value.AddDays(minWeeks * 7)))
{
return Json(data: $"Inspection window end date must be at least {minWeeks} weeks after start date.");
}
return Json(data: true);
}
Questo è collegato a una proprietà nella mia classe come segue:
[Required]
[Remote("ValidateWindowEndDate", "InspectionWindow", AdditionalFields = "StartDate")]
public DateTime EndDate { get; set; }
Quando immetto dati non validi nella mia vista, la convalida avviene come previsto. Ma, se ottengo un'istanza dell'oggetto nel codice, quindi cambiare la data in una non valida e salvarla di nuovo nel database, ad es.
luInspectionWindow.EndDate = luInspectionWindow.StartDate.AddDays(1);
_context.Update(luInspectionWindow);
await _context.SaveChangesAsync();
quindi il salvataggio avviene senza eccezioni e il metodo di convalida non viene mai chiamato, il che non era il comportamento che mi aspettavo. Pensavo che EF avrebbe rifiutato il record come non valido? È questo il comportamento previsto?
Quindi, questo risulta essere un cambiamento nel modo in cui EF lavora in Core. Ora non esegue più alcuna convalida, che viene lasciata al client e al server (tramite Model.State
). Rowan Miller spiega tale decisione nel repository EF come segue:
In EF Core abbiamo abbandonato la convalida poiché di solito è già stata eseguita lato client, lato server e quindi anche nel database.
Non riesco a utilizzare lo stato del modello nel mio particolare scenario, quindi ho cercato di far funzionare manualmente la convalida remota tramite l'oggetto Validator
, ma non ho avuto fortuna neanche con quello. Maggiori informazioni su questo in questa domanda: Validator.TryValidateObject non chiama la convalida remota .