Реализация отношения «один ко многим»



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

1. Добавьте обработчик события загрузки формы и в нем добавьте два заказа в базу данных, сохраните изменения и отобразите их в списке ListBox (orderlistBox):

   private void CustomerViewer_Load(object sender, EventArgs e)

   {

context.Orders.Add(new Order { ProductName = "Аудио", Quantity = 12, PurchaseDate = DateTime.Parse("12.01.2016") });

context.Orders.Add(new Order { ProductName = "Видео", Quantity = 22, PurchaseDate = DateTime.Parse("10.01.2016") });

     context.SaveChanges();

    orderlistBox.DataSource = context.Orders.ToList();

   }

2. В код создания заказчика (в обработчике события нажатия кнопки Добавить данные) добавьте присвоение полю Orders выбранных заказов – элементов списка:

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

3. Постройте и запустите приложение. Выберете переключатель Orders. Нажмите кнопку Показать данные. Информация о созданных заказах должны отобразиться в реализованных элементах.

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

Изменение конфигурации базы данных

Реализованные элементы конфигурации базы данных можно переопределить с помощью средств Entity Framework: аннотации в виде атрибутов C# и строгая типизация с помощью Fluent API.

Использование аннотаций метаданных

Аннотации метаданных применяются непосредственно к классам и свойствам класса в виде атрибутов (атрибуты доступны в приложении при наличии ссылок на сборки System.ComponentModel.DataAnnotations.dll и EntityFramework.dll).

В этой части упражнения вы примените аннотации метаданных к классу Customer для того чтобы обеспечить следующие изменения в этом классе:

  • Поле Name не должно иметь значение NULL в таблице базы данных, и длина поля не должна превышать 30 символов.
  • Максимальная длина поля email не должна превышать 100 символов.
  • Поле Age должно находиться в пределах от 8 до 100.
  • Фотография должна хранится в типе изображения Image SQL Server, а не в VARBINARY (max).

1. Добавьте ссылки на пространства имен в файле Model.cs:

System.ComponentModel.DataAnnotations

System.ComponentModel.DataAnnotations.Schema

2. После этого измените структуру класса Customer, чтобы указать условия, приведенные выше:

   [Required]

   [MaxLength(30)]

   public string Name { get; set; }

 

   [MaxLength(100)]

   public string Email { get; set; }

 

   [Range(8, 100)]

   public int Age { get; set; }

 

   [Column(TypeName = "image")]

   public byte[] Photo { get; set; }

3. Запустите приложение и попытаетесь вставить нового заказчика, вы получите исключение InvalidOperationException (проблема заключается в способе инициализации базы данных, используемом в Code-First):

The model backing the 'SampleContext' context has changed since the database was created. Consider using Code First Migrations to update the database.

Модель класса контекста SampleContext была изменена , когда база данных уже была создана . Рассмотрите возможность обновления базы данных с помощью Code First Migrations.

При генерации базы данных была добавлена таблица __MigrationHistory, в последней записи которой хранится структура модели созданной базы. После внесения изменений в класс Customer Entity Framework определил, что модель поменялась – она не соответствует последней записи в этой таблице и, следовательно, не может гарантировать, что ваша модель будет правильно отображаться в базе данных, в результате чего Entity Framework автоматически сгенерировал исключение.

Можно вручную удалить базу данных и запустить проект снова, при первой вставке данных сгенерируется новая база данных.

Другим решением проблемы, которое будет использовано в этом упражнении, является использование возможности Code-First с помощью статического метода SetInitializer() класса Database обнаруживать изменения в модели данных и автоматически удалять, и генерировать новую базу данных.

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

4. В конструкторе формы главного приложения после создания контекста вызовите метод SetInitializer() класса Database и передайте ему экземпляр объекта DropCreateDatabaseIfModelChanges, который указывает Code-First, что при изменении модели данных, базу данных нужно будет удалить и воссоздать с новой структурой:

Database.SetInitializer(new DropCreateDatabaseIfModelChanges<SampleContext>());

5. Постройте и запустите приложение. Заполните данные и вставьте их в базу. В этом случае Code First найдет разницу в новой модели и, с разрешения инициализатора, удалит и заново создаст базу данных.

Замечание. Если вы открыли таблицу базы данных для чтения данных где-то еще (например, в окне Server Explorer среды Visual Studio), Code First будет не в состоянии удалить базу данных, т.к. она используется другим процессом. В этом случае, возникнет заметная задержка при вставке данных, пока EF пытается удалить базу данных, а затем в конце концов будет сгенерировано следующее исключение:

SqlException: Cannot drop database "MyShop" because it is currently in use.

SqlException: Невозможно удалить базу данных "MyShop" т.к. она сейчас используется.


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

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






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