none
WPF MVVM EntityFramework - вставить новую запись в БД RRS feed

  • Вопрос

  • Здравствуйте! 

    Теоретический вопрос по концепции MVVM и привязке данных при добавлении новых записей.

    Использую WPF, MVVM, EF и элемент управления DataGrid. Необходимо добавить новую запись в БД.

    На форме есть textBox'ы, datePicker'ы, comboBox'ы для ввода новых данных.

    Есть DataGrid, данные в которой отображаются из ViewModel. Для добавления новых записей во ViewModel завел объекты-свойства, например, Customer NewCustomer {get; set; } и Order NewOrder {get; set; }. Поля этих объектов как раз привязал к полям ввода, например, так: <TextBox Text={Binding NewCustomer.Name}/>.

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

    Примерно так:

     				
    	 
     
     int orderId = GetOrderId(NewOrder.Number, NewOrder.Date); // Проверяем, есть ли заказ с таким номером и за дату в БД
                     if (orderId == 0) // Если заказа нет - добавляем его
                     {
                            dbContext.Order.Add(NewOrder);
                            dbContext.SaveChanges();
                            orderId = GetOrderId(NewOrder.Number, NewOrder.Date); // Проверяем, что заказ вставился. Запоминаем его id чтобы привязать к заказчику
                            MessageBox.Show("orderId после вставки : " + orderId);
                    }
    
                    int customerId = GetCustomerId(NewCustomer.Name); // Получаем id заказчика
                      if (customerId == 0) // Если заказчик не в базе - добавляем его туда
                      {
                        if (orderId != 0) // На всякий случай проверяем, вдруг вставка заказа не произошла и мы вставим заказчика без заказа
                        {
                            NewCustomer.OrderId = orderId;
    
                            dbContext.Customer.Add(NewCustomer);
                            dbContext.SaveChanges();
                        }
    	
    	   private int GetOrderId(long number, DateTime date)
            {
                return dbContext.Order.Where(x => x.Number == number)
    								  .Where(x => x.Date == date)
                                      .Select(x => x.Id)
                                      .SingleOrDefault();
            }

    Моя реализация вообще приемлема?  :)


    • Изменено kremlinbot 26 декабря 2016 г. 0:49
    26 декабря 2016 г. 0:37

Ответы

  • Добрый день.

    Да, можно делать так.

    P.s. У вас в модели данных похоже небольшая ошибка. Сейчас у вас отношение один ко многим не в ту сторону, у вас одному заказу может соответствовать несколько заказчиков, а, скорее всего, должно быть наоборот.

    • Помечено в качестве ответа kremlinbot 26 декабря 2016 г. 21:00
    26 декабря 2016 г. 6:02
    Отвечающий

Все ответы

  • Добрый день.

    Да, можно делать так.

    P.s. У вас в модели данных похоже небольшая ошибка. Сейчас у вас отношение один ко многим не в ту сторону, у вас одному заказу может соответствовать несколько заказчиков, а, скорее всего, должно быть наоборот.

    • Помечено в качестве ответа kremlinbot 26 декабря 2016 г. 21:00
    26 декабря 2016 г. 6:02
    Отвечающий
  • Алексей, спасибо. Пример составлял поздно ночью и в голове тоже крутилось что что-то не так. Застрять внимание не стал, так как пример условный. Главное насчёт логики привязки и вставки было уточнить. По примерам смотрю, многие практикуют кнопки add и new,  и привязку полей ввода данных делают к SelectedItem. У кого есть желание, поделитесь практикой в данном вопросе - добавление данных через большое количество полей ввода.
    • Изменено kremlinbot 26 декабря 2016 г. 21:01
    26 декабря 2016 г. 21:00
  • Как показывает практика, лучше для добавления/редактирования отдельный VM создавать, и пользователю проще когда он это делает в отдельном окне, да и разделение зон ответственности между классами это хорошая практика.
    27 декабря 2016 г. 6:06
    Отвечающий