#asp.net-core #entity-framework-core #asp.net-core-webapi #asp.net-core-3.1
#asp.net-core #entity-framework-core #asp.net-core-webapi #asp.net-core-3.1
Вопрос:
У меня есть это.Ниже находится контроллер Net Core API, который выполняет запрос PUT.
Таблица, затронутая в Sql Server, выглядит следующим образом:
carID (varchar(15), NULL)
optionID (varchar(15), NOT NULL)
optionDescription (varchar(255), NULL)
optionType (varchar(50), NULL)
factoryID (varchar(15), NULL)
При тестировании я отправляю свойства, которые я хочу изменить, таким образом, в моем вызове API PUT:
{
" optionID": "633fr",
"optionDescription": "Full Tech Package A"
}
Он обновляет запись в базе данных, но также устанавливает все значения, не отправленные в вызове PUT, в NULL. Поэтому, хотя он обновляет optionDescription, он устанавливает все остальные значения в NULL, кроме optionID.
Как мне запретить ему устанавливать другие значения?
Спасибо!
Вот контроллер:
// PUT: api/CarOptions/5
[HttpPut("{id}")]
public async Task<IActionResult> PutCarOptions(Guid id, CarOptions carOptions)
{
if (id != carOptions.OptionId)
{
return BadRequest();
}
_context.Entry(carOptions).State = EntityState.Modified;
try
{
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!CarOptionsExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return NoContent();
}
Комментарии:
1. Получить запись из базы данных, изменить только те поля, которые вы хотите, сохранить в базе данных?
Ответ №1:
Согласно вашему описанию, я предлагаю вам сначала попытаться присоединить модель, а затем установить для конкретного свойства IsModified значение true.
Это обновит только определенные поля вместо обновления всей модели.
Более подробную информацию вы можете найти в приведенном ниже примере:
// PUT: api/CarOptions/5
[HttpPut("{id}")]
public async Task<IActionResult> PutCarOptions(Guid id, CarOptions carOptions)
{
_context.Documents.Attach(carOptions);
_context.Entry(carOptions).Property(x => x.optionDescription).IsModified = true;
_context.SaveChanges();
return NoContent();
}