Суть задачи сводится к тому, чтобы получая передаваемые в POST запросе поля, одной сущности (не привязанной к EF) те из них, которые присутствуют в EF модели обновлять, не затрагивая других полей
Сейчас есть несколько костыльных решений, которые очень не нравятся.
[Authorize]
[HttpPatch]
// PATCH: UserProfile
public ActionResult Index(SimpleUserCard ucard)
{
var uid = User.Identity.Name;
try
{
var user = db.Users.Where(u => u.PhoneNumber == uid).FirstOrDefault();
// вот здесь надо произвести проверку на наличие
//соответствующего поля в принятой модели, и обновлять только
// поля, которые имеются в ней.
user.FirstName = ucard.FirstName;
user.SecondName = ucard.SecondName;
user.Patronymic = ucard.Patronymic;
user.DateBirth = ucard.DateBirth;
user.AvatarId = ucard.AvatarId;
db.SaveChanges();
var up = new UserProfile(user, true);
return Json(new { Status = "Success",UserProfile = up });
} catch
{
return Json(new { Status = "Error" });
}
Еще есть другое решение, но оно так же не очень устраивает.
public IHttpActionResult Patch(int key, UserSpecialisations specialisation)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
var userId = AppUser.Id;
//только сам пользователь может обновлять специализации
//проверка на добавление исключительно системных базовый тем специализаций
if (db.UsersSpecialisations.Where(z => z.UserId == userId && z.Specialisation.IsDeleted == false && z.Id == specialisation.SpecialisationId).Any())
{
specialisation.Id = key;
specialisation.UserId = userId;
//для обновления данных должны быть предоставлены все поля (кроме id),
//иначе, те поля которые не указаны станут пустыми
db.UsersSpecialisations.Attach(specialisation);
var entry = db.Entry(specialisation);
entry.State = EntityState.Modified;
entry.Property(e => e.DateAdd).IsModified = false;
entry.Property(e => e.IsDeleted).IsModified = false;
db.SaveChanges();
return Ok();
}
else
{
return BadRequest(ModelState);
}
}