ASP.NET Core Razor PageModel ModelState Недопустимо из-за нового свойства навигации с идентификатором == 0 - PullRequest
0 голосов
/ 23 октября 2019

Я пытаюсь обновить объект, который может иметь необязательный 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(...) приближается к намеченному?

1 Ответ

0 голосов
/ 26 октября 2019

Рассматривали ли вы установку аннотаций данных для идентификатора?

public class ReadBlockDefinition
{
    [Key]
    public int Id { get; set; }
    public string Address { get; set; }
    public int Length { get; set; }
    public int Offset { get; set; }
}

https://docs.microsoft.com/en-us/ef/ef6/modeling/code-first/data-annotations

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...