Пошаговое руководство. Добавление сущностей с помощью свойств внешнего ключа (платформа Entity Framework)
В этом разделе описано, как сформировать концептуальную модель, где внешние ключи доступны в виде свойств, и как написать код для создания сущностей и связей.
Начиная с версии Visual Studio 2010 при создании моделей на основе существующих баз данных Конструктор моделей EDM ADO.NET (конструктор сущностей) создает для типов сущностей скалярные свойства, соответствующие столбцам внешнего ключа в базе данных. Свойства внешнего ключа могут быть использованы для создания и изменения связей между типами сущностей. По умолчанию конструктор сущностей также создает для типов сущностей свойства навигации, которые можно использовать для создания и изменения связей. В этом пошаговом руководстве показано создание связей с использованием как свойств внешнего ключа, так и свойств навигации. Создание связей и управление ими с использованием свойств внешнего ключа упрощает многие распространенные сценарии. Например, использование свойств внешнего ключа позволяет упростить привязку данных и управление параллелизмом. Дополнительные сведения см. в разделе Defining and Managing Relationships.
Предварительные требования
Для выполнения действий, описанных в данном пошаговом руководстве, на компьютере должна быть установлена среда Visual Studio 2010 или более новой версии. Кроме того, необходим доступ к экземпляру сервера баз данных SQL Server, содержащему образец базы данных School. Дополнительные сведения см. в разделе Creating the School Sample Database.
Это пошаговое руководство предполагает наличие достаточного опыта работы с Visual Studio, .NET Framework, а также опыт программирования на языке Visual C# или Visual Basic.
Создание EDMX-файла
Для выполнения этой процедуры должен быть открыт новый проект приложения WPF в среде Visual Studio. В этой процедуре будет создан EDMX-файл на основе двух таблиц из образца базы данных School. EDMX-файл содержит концептуальную модель, модель хранения и их сопоставление. Дополнительные сведения см. в разделе Общие сведения об EDMX-файле (платформа Entity Framework). Типы сущностей в создаваемых концептуальных моделях будут содержать скалярные свойства, соответствующие столбцам внешних ключей в базе данных.
Создание EDMX-файла
Щелкните правой кнопкой мыши имя проекта в обозревателе решений, укажите пункт Добавить, а затем выберите пункт Создать элемент.
Появится диалоговое окно Добавление нового элемента.
Выберите Модель EDM ADO.NET и нажмите «Добавить». (Чтобы уменьшить число отображаемых шаблонов, выберите Данные в списке Установленные шаблоны).
В мастер моделей EDM выберите Создать из базы данных и нажмите кнопку Далее.
В диалоговом окне Выбор подключения к данным подключитесь к образцу базы данных School и нажмите кнопку Далее.
В диалоговом окне Выбор объектов базы данных разверните узел Таблицы и выберите таблицы Course и Department. Обратите внимание, что флажки Формировать имена объектов во множественном или единственном числе и Включить столбцы внешнего ключа в модель по умолчанию установлены. Если оставить флажок Включить столбцы внешнего ключа в модель установленным, то для типов сущностей, сопоставленных столбцам внешнего ключа базы данных, будут созданы скалярные свойства, и между сущностями будут созданы сопоставления на основе внешнего ключа. Если сбросить этот флажок, то между типами сущностей будут созданы независимые сопоставления. Дополнительные сведения см. в разделах Association Element (CSDL) и ReferentialConstraint Element (CSDL).
Если оставить флажок Формировать имена объектов во множественном или единственном числе установленным, то имена наборов сущностей, типов сущностей и свойств навигации будут преобразованы с использованием правил английского языка для образования единственного и множественного числа. Дополнительные сведения см. в разделе Диалоговое окно «Выбор объектов базы данных» (мастер моделей EDM).
Это пошаговое руководство подразумевает, что оба флажка были установлены.
Нажмите кнопку Готово.
EDMX-файл будет добавлен к проекту и показан в конструкторе сущностей. На экране будут показаны два типа сущности (Department и Course), связанные сопоставлением «один-ко-многим» (1:*). Сопоставление создается с использованием справочного ограничения. Чтобы просмотреть ее, откройте EDMX-файл в редакторе XML:
<Association Name="FK_Course_Department"> <End Role="Department" Type="SchoolModel.Department" Multiplicity="1" /> <End Role="Course" Type="SchoolModel.Course" Multiplicity="*" /> <ReferentialConstraint> <Principal Role="Department"> <PropertyRef Name="DepartmentID" /> </Principal> <Dependent Role="Course"> <PropertyRef Name="DepartmentID" /> </Dependent> </ReferentialConstraint> </Association>
Дополнительные сведения см. в разделе ReferentialConstraint Element (CSDL).
Создание пользовательского интерфейса
В этой процедуре к приложению будут добавлены элементы управления, позволяющие создавать и обновлять информацию о кафедрах и курсах.
Чтобы создать пользовательский интерфейс, выполните следующие действия.
В меню Данные Visual Studio выберите команду Показать источники данных.
Появится панель Источники данных.
Перейдите на вкладку
MainWindow.xaml
, чтобы показать область конструктора MainWindow.На панели Источники данных щелкните источник данных Курсы и выберите из раскрывающегося списка пункт Детали.
Повторите шаг 2 для источника данных Кафедры.
На панели Источники данных разверните источник данных Courses, щелкните поле DepartmentID и выберите Нет.
На панели Источники данных разверните источник данных Departments, щелкните поле Name и выберите ComboBox.
Перетащите источники данных Courses и Departments на область конструктора MainWindow.
В области конструктора MainWindow будут созданы элементы управления Grid для источников данных Courses и Departments.
Снимите флажок IsEnabled в окне Свойства для полей ввода Department ID, Budget, Start Date и Administrator.
Установите флажок IsEditable в окне «Свойства» для поля со списком Name.
Перетащите из области элементов в область конструктора MainWindow элемент управления Флажок. Измените имя элемента управления Флажок на
newDepartment
и установите в его свойстве Content значение New Department.Перетащите из области элементов элемент управления Кнопка в область конструктора MainWindow. Измените имя элемента управления Кнопка на
addWithFKButton
и установите в его свойстве Content значение Add (FK).Перетащите из области элементов элемент управления Кнопка в область конструктора MainWindow. Измените имя элемента управления Кнопка на
addWithNavPropButton
и установите в его свойстве Content значение Add (Nav Prop).
Создание пользовательского интерфейса завершено.
Добавление связанных сущностей с помощью свойств внешнего ключа (платформа Entity Framework)
В этой процедуре к приложению будет добавлен код, позволяющий добавлять новые курсы и кафедры с помощью свойств внешнего ключа.
Добавление связанных сущностей с помощью свойств внешнего ключа
Откройте файл
MainWindow.xaml.vb
илиMainWindow.xaml.cs
и добавьте следующий оператор Using (C#) или Imports (Visual Basic):Imports System.Data.Objects
using System.Data.Objects;
Добавьте в класс
MainWindow
следующий элемент. Это контекст ObjectContext, к которому вы потом будете добавлять объекты.Private context As SchoolEntities
private SchoolEntities context;
Замените код метода
Window_Loaded
на следующий код, заполняющий элемент управления GridView списком кафедр:context = New SchoolEntities() Dim departmentsViewSource As CollectionViewSource = _ DirectCast((Me.FindResource("DepartmentsViewSource")), _ CollectionViewSource) Dim departmentsQuery As ObjectQuery(Of Department) = _ Me.GetDepartmentsQuery(context) departmentsViewSource.Source = _ departmentsQuery.Execute(MergeOption.AppendOnly)
context = new SchoolEntities(); CollectionViewSource departmentsViewSource = ((CollectionViewSource)(this.FindResource("departmentsViewSource"))); ObjectQuery<Department> departmentsQuery = this.GetDepartmentsQuery(context); departmentsViewSource.Source = departmentsQuery.Execute(MergeOption.AppendOnly);
В области конструктора MainWindow дважды нажмите кнопку New Department.
Метод
newDepartment_Checked
добавляется в файл с выделенным кодом.Добавьте следующий код в метод
newDepartment_Checked
. Это позволит добавить новую кафедру к контексту ObjectContext.Dim departmentsViewSource As CollectionViewSource = _ DirectCast((FindResource("DepartmentsViewSource")), _ CollectionViewSource) If newDepartment.IsChecked = True Then departmentsViewSource.Source = Nothing DepartmentIDTextBox.IsEnabled = True BudgetTextBox.IsEnabled = True StartDateDatePicker.IsEnabled = True AdministratorTextBox.IsEnabled = True End If
CollectionViewSource departmentsViewSource = (CollectionViewSource)(FindResource("departmentsViewSource")); if (newDepartment.IsChecked == true) { departmentsViewSource.Source = null; departmentIDTextBox.IsEnabled = true; budgetTextBox.IsEnabled = true; startDateDatePicker.IsEnabled = true; administratorTextBox.IsEnabled = true; }
В области конструктора MainWindow дважды нажмите кнопку Add (FK).
Метод
addWithFKButton_Click
добавляется в файл с выделенным кодом.Добавьте следующий код в метод
addWithFKButton_Click
. Обратите внимание, что для того, чтобы связать с кафедрой новый курс, необходимо задать значение свойства DepartmentID для нового курса.If newDepartment.IsChecked = True Then Dim dept As New Department() dept.DepartmentID = Convert.ToInt32(DepartmentIDTextBox.Text) dept.Name = NameComboBox.Text dept.Budget = Convert.ToInt32(BudgetTextBox.Text) dept.StartDate = Convert.ToDateTime(StartDateDatePicker.SelectedDate) dept.Administrator = Convert.ToInt32(AdministratorTextBox.Text) context.Departments.AddObject(dept) End If Dim course As New Course() course.CourseID = Convert.ToInt32(CourseIDTextBox.Text) course.Title = TitleTextBox.Text course.Credits = Convert.ToInt32(CreditsTextBox.Text) ' The new course is associated with a department ' by setting the DepartmentID property. course.DepartmentID = Convert.ToInt32(DepartmentIDTextBox.Text) context.Courses.AddObject(course) context.SaveChanges()
if (newDepartment.IsChecked == true) { Department dept = new Department { DepartmentID = Convert.ToInt32(departmentIDTextBox.Text), Name = nameComboBox.Text, Budget = Convert.ToInt32(budgetTextBox.Text), StartDate = Convert .ToDateTime(startDateDatePicker.SelectedDate), Administrator = Convert .ToInt32(administratorTextBox.Text) }; context.Departments.AddObject(dept); } Course course = new Course { CourseID = Convert.ToInt32(courseIDTextBox.Text), Title = titleTextBox.Text, Credits = Convert.ToInt32(creditsTextBox.Text), // The new course is associated with a department // by setting the DepartmentID property. DepartmentID = Convert.ToInt32(departmentIDTextBox.Text) }; context.Courses.AddObject(course); context.SaveChanges();
![]() |
---|
Если новая кафедра и новый курс добавляются одновременно, то их свойства навигации не синхронизируются до тех пор, пока не вызван метод SaveChanges.Например, при попытке получить доступ к новой кафедре через свойство навигации нового курса вызовом метода SaveChanges будет возвращено значение null. |
Нажмите клавиши Crtl+F5, чтобы запустить программу. Можно добавить новый курс для выбранной кафедры, изменив сведения о курсе и нажав кнопку Add (FK). Чтобы добавить новый курс для выбранной кафедры, установите флажок New Department, измените сведения о курсе и кафедре и нажмите кнопку Add (FK).
Добавление связанных сущностей с помощью свойств навигации
В этой процедуре в приложение будет добавлен код для добавления новых курсов и кафедр с помощью свойств навигации.
Описание процедуры
В области конструктора MainWindow дважды нажмите кнопку Add (Nav Prop).
Метод
addWithNavPropButton_Click
добавляется в файл с выделенным кодом.Добавьте следующий код в метод
addWithNavPropButton_Click
. Обратите внимание, что для того, чтобы связать с кафедрой новый курс, нужно задать значение свойства навигации Department нового курса. При этом также будет добавлен новый курс к контексту ObjectContext.Dim dept As Department If newDepartment.IsChecked = True Then dept = New Department() dept.DepartmentID = Convert.ToInt32(DepartmentIDTextBox.Text) dept.Name = NameComboBox.Text dept.Budget = Convert.ToInt32(BudgetTextBox.Text) dept.StartDate = Convert.ToDateTime(StartDateDatePicker.SelectedDate) dept.Administrator = Convert.ToInt32(AdministratorTextBox.Text) context.Departments.AddObject(dept) Else dept = DirectCast(NameComboBox.SelectedItem, Department) End If Dim course As New Course() course.CourseID = Convert.ToInt32(CourseIDTextBox.Text) course.Title = TitleTextBox.Text course.Credits = Convert.ToInt32(CreditsTextBox.Text) ' The new course is associated with a department ' by setting the Department navigation property. ' This also adds the new course to the context. course.Department = dept context.Courses.AddObject(course) context.SaveChanges()
Department dept; if (newDepartment.IsChecked == true) { dept = new Department { DepartmentID = Convert.ToInt32(departmentIDTextBox.Text), Name = nameComboBox.Text, Budget = Convert.ToInt32(budgetTextBox.Text), StartDate = Convert .ToDateTime(startDateDatePicker.SelectedDate), Administrator = Convert.ToInt32(administratorTextBox.Text) }; context.Departments.AddObject(dept); } else { dept = (Department)nameComboBox.SelectedItem; } Course course = new Course { CourseID = Convert.ToInt32(courseIDTextBox.Text), Title = titleTextBox.Text, Credits = Convert.ToInt32(creditsTextBox.Text), // The new course is associated with a department // by setting the Department navigation property. // This also adds the new course to the context. Department = dept }; context.SaveChanges();
Нажмите клавиши Crtl+F5, чтобы запустить программу. Можно добавить новый курс для выбранной кафедры, изменив сведения о курсе и нажав кнопку Add (Nav Prop). Чтобы добавить новый курс для выбранной кафедры, установите флажок «Новая кафедра», измените сведения о курсе и кафедре и нажмите кнопку Add (Nav Prop).
См. также
Задачи
Как создать новый EDMX-файл (средства модели EDM)