Как обновить список элементов в Entity Framework?

У меня есть список объектов. Эти объекты и некоторые из их свойств отображаются в виде сетки. Пользователь может добавлять, удалять и изменять свойства любого выбранного объекта.

Подход к обновлению выполняется при нажатии кнопки сохранения (а не сразу с предпринятыми действиями).

Как лучше всего обновить список, который может включать добавленные объекты, удаленные объекты и объекты с измененными свойствами в моем веб-API 2 с помощью Entity Framework?

Класс клиента:

public class Customer
{
    public int CustomerId { get; set; }
    public string Name { get; set; }
    public string Phone { get; set; }
    public string Email { get; set; }
}

Класс клиентов:

Public Class Customers
{
    public List<Customer> Customers { get; set; }
}

Метод PUT для клиентов на данный момент:

ResponseType(typeof(void))]
public async Task<IHttpActionResult> PutCustomersViewModel(CustomersViewModel custViewModel)
{
   if (!ModelState.IsValid)
       return BadRequest(ModelState);

   // Not sure how to iterate thru the list and update or add accordingly


   _context.Entry(customer).State = EntityState.Modified;

   try
   {
       await _context.SaveChangesAsync();
   }
   catch(DbEntityValidationException ex)
   {
       foreach(var entityValidationErrors in ex.EntityValidationErrors)
       {
           foreach(var validationError in entityValidationErrors.ValidationErrors)
           {
               System.Diagnostics.Debug.WriteLine("Property: " + validationError.PropertyName + " Error: " + validationError.ErrorMessage);
           }
       }
   }
   catch(DbUpdateConcurrencyException)
   {
        return NotFound();

        throw;
    }

    return StatusCode(HttpStatusCode.NoContent);
}

Я могу удалить все элементы и снова добавить их, но я считаю, что это неправильный подход. Есть ли способ сравнить и только добавить / обновить изменения / отсутствующие элементы?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
340
4

Ответы 4

Вы не хотите удалять и повторно добавлять объекты - это может фактически удалить то, что у вас есть в базе данных, и повторно добавить новые.

Вы можете перебирать объекты, чтобы найти те, которые находятся в обоих (обновление), и те, которые находятся в цели, но не в источнике (удалить), и те, которые находятся в источнике, но не в цели (создать). Пока вы идете, вы можете внести изменения в контекст БД, а затем просто сохранить изменения.

Вы можете использовать что-то вроде AutoMapper.org, извлечь коллекцию объектов базы данных, которые вы хотите отредактировать, объединить с помощью automapper, а затем сохранить изменения.

Это просто моя точка зрения, если ее трудно реализовать, возможно, это потому, что метод пытается сделать слишком много.

Такой подход создаст дрянной код с проблемами обслуживания.

Лучше всего разделить это на 3 метода: создание, обновление и удаление.

И поместите это действие прямо в строку вашей сетки данных или событие catch при изменении сетки данных, чтобы правильно применить изменения к вашему методу сохранения в вашем представлении.

В идеале вы правы, однако бизнес-требования указывают, к сожалению, на то, чтобы разрешить пользователям играть с контентом (вносить изменения, удалять и добавлять), чтобы получить то, что они хотят, прежде чем фактически сохранить его. Еще один недостаток - транзакция базы данных для каждого действия пользователя, а этого было бы слишком много для этой сетки.

amindomeniko 29.11.2018 17:50

да, я знаю, может быть, я ищу что-то вроде источника событий, и сохранение отправит ваши события, и ваша точка входа должна их выполнить

Jouan Antoine 30.11.2018 16:10

Сделайте это так, как сказал @Jouan Antoine ... кнопки для каждого действия CRUD или проверьте состояние объекта:

 switch (custViewModel.State)
 {
    case State.Added:
     break;
    case State.Unchanged:
     break;
    case State.Modified:
    break;
    case State.Deleted:
    break;
    case State.Detached:
    break;
  }

ваша сетка:

Не могли бы вы подробнее рассказать об этом. Мне не разрешено совершать какие-либо транзакции с базой данных, пока пользователь не будет уверен в своих изменениях в сетке.

amindomeniko 29.11.2018 17:53

Я не уверен, что вы имеете в виду в отношении уверенности в своих изменениях в сетке ?? Вы должны применить проверку (как на стороне клиента, так и на стороне сервера) перед выполнением любых транзакций. Это обеспечит соблюдение ваших бизнес-правил.

user10553012 29.11.2018 18:12

Под «уверенностью» я подразумеваю, что пользователи должны иметь возможность отменить все изменения, которые они внесли до «сохранения» своих изменений. Они должны иметь возможность отменить некоторые или все свои изменения до того, как они будут сохранены в базе данных. Следовательно, у меня может быть только одна кнопка, которая выполняет все изменения в этом конкретном сценарии. Таким образом, вы можете изменить фамилию и другой номер телефона, а затем добавить нового клиента, и это нормально, но эти действия не могут быть быстро сохранены, и они могут происходить только вместе.

amindomeniko 29.11.2018 19:53

Это будет сложно сделать без сохранения предварительных изменений в базе данных. Я настоятельно рекомендую создать промежуточные таблицы в вашей базе данных и сохранить изменения в этих таблицах. После того, как пользователь примет изменения, переместите данные из промежуточных в реальные таблицы. Вам нужен способ сохранить все до нажатия кнопки принятия. Как вы выполняете свои действия CRUD, такие как добавление и обновление? Вы должны предоставить пользователю способ ввода / изменения информации и ее сохранения.

user10553012 29.11.2018 20:27

Я сохраняю все изменения в списке объектов (List <Customer>) в памяти до того, как пользователь нажмет кнопку подтверждения. Я удивлен, потому что ожидал, что обновление списка в EF будет намного проще. У меня нет проблем с операциями CRUD для сущностей с отдельными элементами, но если мне нужно обновить список элементов в сущности, проходящей несколько этапов, кажется, много работы для того, чем должен был быть EF.

amindomeniko 29.11.2018 21:22

Он предназначен для одновременной обработки одного объекта. Вы можете выполнить foreach в списке и просто SaveChanges () для каждого элемента в коллекции. Не очень эффективно. Вы должны реализовать транзакцию для отката изменений. Я думаю, что это в context.Database.BeginTransaction ()

user10553012 29.11.2018 21:45

Другие вопросы по теме