Пошаговое руководство. Добавление сущностей с помощью свойств внешнего ключа (платформа 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-файла

  1. Щелкните правой кнопкой мыши имя проекта в обозревателе решений, укажите пункт Добавить, а затем выберите пункт Создать элемент.

    Появится диалоговое окно Добавление нового элемента.

  2. Выберите Модель EDM ADO.NET и нажмите «Добавить». (Чтобы уменьшить число отображаемых шаблонов, выберите Данные в списке Установленные шаблоны).

  3. В мастер моделей EDM выберите Создать из базы данных и нажмите кнопку Далее.

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

  5. В диалоговом окне Выбор объектов базы данных разверните узел Таблицы и выберите таблицы Course и Department. Обратите внимание, что флажки Формировать имена объектов во множественном или единственном числе и Включить столбцы внешнего ключа в модель по умолчанию установлены. Если оставить флажок Включить столбцы внешнего ключа в модель установленным, то для типов сущностей, сопоставленных столбцам внешнего ключа базы данных, будут созданы скалярные свойства, и между сущностями будут созданы сопоставления на основе внешнего ключа. Если сбросить этот флажок, то между типами сущностей будут созданы независимые сопоставления. Дополнительные сведения см. в разделах Association Element (CSDL) и ReferentialConstraint Element (CSDL).

    Если оставить флажок Формировать имена объектов во множественном или единственном числе установленным, то имена наборов сущностей, типов сущностей и свойств навигации будут преобразованы с использованием правил английского языка для образования единственного и множественного числа. Дополнительные сведения см. в разделе Диалоговое окно «Выбор объектов базы данных» (мастер моделей EDM).

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

  6. Нажмите кнопку Готово.

    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).

Создание пользовательского интерфейса

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

Чтобы создать пользовательский интерфейс, выполните следующие действия.

  1. В меню Данные Visual Studio выберите команду Показать источники данных.

    Появится панель Источники данных.

  2. Перейдите на вкладку MainWindow.xaml, чтобы показать область конструктора MainWindow.

  3. На панели Источники данных щелкните источник данных Курсы и выберите из раскрывающегося списка пункт Детали.

  4. Повторите шаг 2 для источника данных Кафедры.

  5. На панели Источники данных разверните источник данных Courses, щелкните поле DepartmentID и выберите Нет.

  6. На панели Источники данных разверните источник данных Departments, щелкните поле Name и выберите ComboBox.

  7. Перетащите источники данных Courses и Departments на область конструктора MainWindow.

    В области конструктора MainWindow будут созданы элементы управления Grid для источников данных Courses и Departments.

  8. Снимите флажок IsEnabled в окне Свойства для полей ввода Department ID, Budget, Start Date и Administrator.

  9. Установите флажок IsEditable в окне «Свойства» для поля со списком Name.

  10. Перетащите из области элементов в область конструктора MainWindow элемент управления Флажок. Измените имя элемента управления Флажок на newDepartment и установите в его свойстве Content значение New Department.

  11. Перетащите из области элементов элемент управления Кнопка в область конструктора MainWindow. Измените имя элемента управления Кнопка на addWithFKButton и установите в его свойстве Content значение Add (FK).

  12. Перетащите из области элементов элемент управления Кнопка в область конструктора MainWindow. Измените имя элемента управления Кнопка на addWithNavPropButton и установите в его свойстве Content значение Add (Nav Prop).

Создание пользовательского интерфейса завершено.

Добавление связанных сущностей с помощью свойств внешнего ключа (платформа Entity Framework)

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

Добавление связанных сущностей с помощью свойств внешнего ключа

  1. Откройте файл MainWindow.xaml.vb или MainWindow.xaml.cs и добавьте следующий оператор Using (C#) или Imports (Visual Basic):

    Imports System.Data.Objects
    
    using System.Data.Objects;
    
  2. Добавьте в класс MainWindow следующий элемент. Это контекст ObjectContext, к которому вы потом будете добавлять объекты.

    Private context As SchoolEntities
    
    private SchoolEntities context;
    
  3. Замените код метода 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);
    
  4. В области конструктора MainWindow дважды нажмите кнопку New Department.

    Метод newDepartment_Checked добавляется в файл с выделенным кодом.

  5. Добавьте следующий код в метод 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;
    }
    
  6. В области конструктора MainWindow дважды нажмите кнопку Add (FK).

    Метод addWithFKButton_Click добавляется в файл с выделенным кодом.

  7. Добавьте следующий код в метод 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();
    
Ee828425.note(ru-ru,VS.100).gifПримечание
Если новая кафедра и новый курс добавляются одновременно, то их свойства навигации не синхронизируются до тех пор, пока не вызван метод SaveChanges.Например, при попытке получить доступ к новой кафедре через свойство навигации нового курса вызовом метода SaveChanges будет возвращено значение null.

Нажмите клавиши Crtl+F5, чтобы запустить программу. Можно добавить новый курс для выбранной кафедры, изменив сведения о курсе и нажав кнопку Add (FK). Чтобы добавить новый курс для выбранной кафедры, установите флажок New Department, измените сведения о курсе и кафедре и нажмите кнопку Add (FK).

Добавление связанных сущностей с помощью свойств навигации

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

Описание процедуры

  1. В области конструктора MainWindow дважды нажмите кнопку Add (Nav Prop).

    Метод addWithNavPropButton_Click добавляется в файл с выделенным кодом.

  2. Добавьте следующий код в метод 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)

Другие ресурсы

Working with Foreign Keys (Entity Framework)