Редактирование модели – подход Code-Second



Далее в этом упражнении вы используете подход к работе, называемый Code-Second, когда вы вручную изменяете структуру базы данных с помощью T-SQL, а затем отражаете эти изменения в классах модели. Такой подход является единственной возможностью изменить структуру базы данных, не удаляя ее (чтобы не удалять уже вставленные данные).

Допустим, вам нужно изменить структуру таблицы Customer изменив имя столбца Name на FirstName и добавив новый столбец LastName (вспомните, что интерфейс формы изначально создавался для этого свойства).

Для решения этой задачи выполните следующие действия:

1. Используя программу SQL Server Management Studio или окно Server Explorer в Visual Studio удалите таблицу __MigrationHistory.

2. Выполните следующий SQL-код для изменения структуры таблиц (для этого щелкните правой кнопкой мыши по имени таблицы Customer в окне Server Explorer и выберите из контекстного меню команду New Query):

USE MyShop;

ALTER TABLE Customers ADD LastName NVARCHAR(30) NULL;

EXEC sp_rename @objname = 'Customers.Name', @newname = 'FirstName';

3. Внесите соответствующие изменения в класс Customer:

   [Required]

   [MaxLength(30)]

   public string FirstName { get; set; }

      public string LastName { get; set; }

4. Измените код заполнения базы данных:

a) измените (выделены жирным шрифтом) код заполнения свойств модели:

       Customer customer = new Customer

       {

        FirstName = this.textBoxname.Text,

          LastName = this.textBoxlastname.Text,

        Email = this.textBoxmail.Text,

        Age = Int32.Parse(this.textBoxage.Text),

        Orders = orderlistBox.SelectedItems.OfType<Order>().ToList(),

        Photo = Ph

        };

b) добавьте код для очищения поля фамилии:

textBoxlastname.Text = String.Empty;

c) замените в коде идентификатор Name на FirstName,

d) удалите вызов метода SetInitializer().

5. Постройте и запустите приложение. Убедитесь, что вставка данных в базу работает корректно и при этом данные, которые вы вставили ранее сохранились.

Использование Fluent API

В этой части упражнения вы примените концепцию Fluent API, которая заключается в вызове ряда стандартных методов для описания настройки конфигурации базы данных. Основными из них являются методы Entity() и Property(), первый дает выбрать объект для настройки, а второй – свойство выбранного объекта сущности.

Когда приходит время для построения модели, DbContext смотрит на структуру классов модели. Fluent API позволяет вмешаться в этот процесс и передать контексту дополнительные данные для конфигурации. Это становится возможным, благодаря переопределению метода DbContext.OnModelCreating(), который вызывается перед тем, как контекст построит сущностную модель данных. Этот метод является виртуальным, так что вы можете изменить его и вставить собственную логику, используя средства Fluent API.

Параметр типа DbModelBuilder в этом методе, позволяет добавлять настройки конфигурации.

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

1. В классе контекста SampleContext переопределите метод OnModelCreating(), в котором настройте свойство LastName сущности Customer аналогично тому как было настроено поле FirstName с помощью атрибутов:

  protected override void OnModelCreating(DbModelBuilder modelBuilder)

  {

       modelBuilder.Entity<Customer>()

          .Property(c => c.LastName).IsRequired().HasMaxLength(30);

  }

2. Постройте приложение и протестируйте его работу.

Подходы с использованием аннотаций и Fluent API можно использовать в Code-First совместно, преимущество при указании одинаковых правил отдается Fluent API. Еще одним преимуществом Fluent API перед аннотациями является то, что он не засоряет код модели и организует взаимосвязь модели с контекстом данных.

Редактирование и удаление данных

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

Действия по редактированию и удалению начинаются с выделения записи данных в элементе GridView. Главной целью этой операции является получение уникального идентификатора, который будет использоваться для поиска требуемой записи для редактирования и удаления.

1. Добавьте обработчик события выделения ячейки элемента GridView.

2. В обработчике присвойте переменной customer объект, находящийся в выделенной строке:

   private void orderGridView_CellClick(object sender, DataGridViewCellEventArgs e)

   {

       if (GridView.CurrentRow == null) return;

       var customer = GridView.CurrentRow.DataBoundItem as Customer;

       if (customer == null) return;

3. Далее присвойте метке labelid уникальный идентификатор записи заказчика (CustomerId) и отобразите выделенного заказчика в соответствующих элементах:

       labelid.Text = Convert.ToString(customer.CustomerId);

       textBoxCustomer.Text = customer.ToString();

 

       textBoxname.Text = customer.FirstName;

       textBoxlastname.Text = customer.LastName;

       textBoxmail.Text = customer.Email;.

       textBoxage.Text = Convert.ToString(customer.Age);

    }

4. Добавьте обработчик нажатия кнопки Редактировать.

5. В обработчике присвойте переменной id значение элемента labelid, с помощью метода Find(id) найдите по значению id нужную запись заказчика и присвойте новые текущие значения элементов формы:

   private void buttonEdit_Click(object sender, EventArgs e)

   {

       if (labelid.Text == String.Empty) return;

 

       var id = Convert.ToInt32(labelid.Text);

       var customer = context.Customers.Find(id);

       if (customer == null) return;

 

       customer.FirstName = this.textBoxname.Text;

       customer.LastName = this.textBoxlastname.Text;

       customer.Email = this.textBoxmail.Text;

       customer.Age = Int32.Parse(this.textBoxage.Text);

6. Далее установите свойству состояния сущности State значение того, что сущность была изменена (Modified), сохраните изменения в базе данных и вызовите метод Output() для заполнения GridView:

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

 

       context.SaveChanges();

       Output();

   }

7. Добавьте обработчик нажатия кнопки Удалить.

8. В обработчике присвойте переменной id значение элемента labelid, с помощью метода Find найдите по значению id нужную запись заказчика, далее установите свойству состояния сущности State значение того, что сущность была помечена к удалению (Deleted), вызовите метод SaveChanges() для удаления сущности и вызовите метод Output() для заполнения GridView:

   private void buttonDel_Click(object sender, EventArgs e)

   {

       if (labelid.Text == String.Empty) return;

 

       var id = Convert.ToInt32(labelid.Text);

       var customer = context.Customers.Find(id);

 

       context.Entry(customer).State = EntityState.Deleted;

       context.SaveChanges();

       Output();

   }

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


Дата добавления: 2019-02-26; просмотров: 187; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!