Вы столкнулись с классической проблемой типов значений Nullable.Проблема с объектами Nullable состоит в том, как определить, действительно ли значение предназначено для того, чтобы быть нулевым и, следовательно, предоставленным, по сравнению с тем, когда значение Null упростится, потому что оно было опущено, поскольку вызывающая сторона предполагала, что это будет означать «не изменено».
При определении такого рода API или интерфейсов я думаю, что это выходит за рамки простого предложения способа взаимодействия с вашим кодом.Вместо того, чтобы быть декларативным об этом, который может быть интерпретирован в любом случае, в этих случаях я предпочитаю быть обязательным и скорее просить пользователя быть конкретным об их намерениях.
Так что в этом случае я бы добавил раздражающий логический элемент, который можно включить или выключить, и я могу просто прочитать их, когда DTO будет выглядеть как
public class Movie
{
public long Id { get; set; }
public string Name { get; set; }
public long? Length { get; set; }
public Boolean IsLengthUpdated{get; set;} = false;//or something that makes sense to describe the length prop has been set
}
Тогда я смогуисследовать мою модель как таковую, чтобы мне не приходилось задавать себе слишком много вопросов об их намерениях
Так что в своем действии Patch вы можете просто сделать что-то вроде
Ваш вызывающий API должен установить либоIsLengthUpdated to true или оставил его как false, и в этом случае вы игнорируете оценку свойства Length вместе.Тогда ваш контроллер будет выглядеть примерно так:
[HttpPatch("{id}")]
public IActionResult Patch(long id, [FromBody] Movie item)
{
Movie movie = (....
if(item.IsLengthUpdated)
{
movie.Length = item.Length;//here either movie.Length is supplied one of it's three states {Null,Updated to new value or left the same}
_context.Entry<Movie>(movie).Property(w => w.Length).IsModified = true;
}
... the rest of your code here
}
Они скорее вернутся и скажут, что обновляют значения без сохранения, тогда я могу вместо них включить соответствующий переключатель поля, иначе они могут оставить его какпотому что в любом случае он всегда будет по умолчанию false.