實體框架核心在保存時不驗證數據?

asp.net-core-mvc entity-framework-core

我有以下遠程驗證規則:

[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);
}

這與我班上的一個屬性有關,如下所示:

[Required]
[Remote("ValidateWindowEndDate", "InspectionWindow", AdditionalFields = "StartDate")]
public DateTime EndDate { get; set; }

當我在視圖中輸入無效數據時,驗證按預期進行。但是,如果我在代碼中獲取對象的實例,則將日期更改為無效日期並將其保存回數據庫,例如

luInspectionWindow.EndDate = luInspectionWindow.StartDate.AddDays(1);
_context.Update(luInspectionWindow);
await _context.SaveChangesAsync();

然後保存發生沒有異常,並且永遠不會調用驗證方法,這不是我期望的行為。我以為EF會拒絕該記錄無效?這是預期的行為嗎?

一般承認的答案

因此,這證明了EF在Core中的工作方式的改變。它現在不再進行驗證,而是留給客戶端和服務器(通過Model.State)。 Rowan Miller解釋EF回購中的決定如下:

在EF Core中,我們放棄了驗證,因為它通常已經在客戶端,服務器端完成,然後在數據庫中完成。

我不能在我的特定場景中使用模型狀態,所以我試圖通過Validator對象手動進行遠程驗證,但我也沒有任何運氣。有關此問題的更多信息: Validator.TryValidateObject不會調用遠程驗證



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow