Я пытаюсь обновить объект, который может иметь необязательный NavigationProperty из HTML-формы.
public class ProcessDataGroup
{
public int Id { get; set; }
public string Name { get; set; }
public ReadDataGroupStrategy ReadDataGroupStrategy { get; set; }
public ReadBlockDefinition ReadBlockDefinition { get; set; }
public int? ReadBlockDefinitionId { get; set; }
}
public class ReadBlockDefinition
{
public int Id { get; set; }
public string Address { get; set; }
public int Length { get; set; }
public int Offset { get; set; }
}
Если ReadBlockDefinition
уже существует и имеет Id > 0
, это работает. Я присоединяю сущность к своему DbContext
, и она будет обновлена. Но возможно, что в html-форме изменяется ReadDataGroupStrategy
, а затем создается новый ReadBlockDefinition
, который по умолчанию, конечно, имеет Id
, равный 0. В этом случае ModelState.IsValid
вернет false и расследование во времяотладка обнаруживает, что она жалуется на поле ReadBlockDefinition.Id
, так что, похоже, она не примет 0 там. Я не могу пропустить поле Id из ReadBlockDefinition
ViewModel, потому что оно важно для обновлений.
Мой обходной путь на данный момент -
if(ProcessDataGroup?.ReadBlockDefinition?.Id == 0)
ModelState.Remove("ProcessDataGroup.ReadBlockDefinition.Id");
до оценки ModelState.IsValid
, но это выглядит довольностранное для меня решение. Я вообще не уверен, почему проверка не проходит в первую очередь. Как я понял до сих пор, валидация не связана с EF Core или какой-либо базовой технологией, и 0 должно быть совершенно допустимым целым числом.
Есть идеи, как это преодолеть? Или ModelState.Remove(...)
приближается к намеченному?