ogregor
@ogregor
арендатор vpn сервера debian

Как правильно в ASP .NET и EF организовать обновление объекта?

Суть задачи сводится к тому, чтобы получая передаваемые в 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);
            }
        }
  • Вопрос задан
  • 468 просмотров
Пригласить эксперта
Ответы на вопрос 2
@dmitrievMV
Для этих целей можно использовать automapper. https://github.com/AutoMapper/AutoMapper
Ответ написан
Комментировать
@kttotto
пофиг на чем писать
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы