Exemplarische Vorgehensweise: Hinzufügen von Entitäten mithilfe von Fremdschlüsseleigenschaften (Entity Framework)

In diesem Thema wird beschrieben, wie ein konzeptionelles Modell mit als Entitätseigenschaften verfügbar gemachten Fremdschlüsseln generiert und Code für die Erstellung von Entitäten und Beziehungen geschrieben wird.

Ab Visual Studio 2010 erstellt der ADO.NET Entity Data Model-Designer (Entity Designer) skalare Eigenschaften für Entitätstypen, die Fremdschlüsselspalten in der Datenbank entsprechen, wenn Sie ein Modell anhand einer vorhandenen Datenbank generieren. Fremdschlüsseleigenschaften können verwendet werden, um Beziehungen zwischen Entitätstypen zu erstellen und zu ändern. Zusätzlich generiert der Entity Designer standardmäßig Navigationseigenschaften für Entitätstypen, mit denen Beziehungen erstellt und geändert werden können. Diese exemplarische Vorgehensweise veranschaulicht, wie Beziehungen sowohl mithilfe von Fremdschlüsseleigenschaften als auch mithilfe von Navigationseigenschaften erstellt werden. Das Erstellen und Verwalten von Beziehungen mit Fremdschlüsseleigenschaften vereinfacht viele allgemeine Szenarien. Datenbindung, Parallelitätssteuerung und N-Tier-Szenarien können z. B. einfacher gestaltet werden, wenn mit Fremdschlüsseleigenschaften Beziehungen erstellt und verwaltet werden. Weitere Informationen finden Sie unter Defining and Managing Relationships.

Erforderliche Komponenten

Zum Durchführen dieser exemplarischen Vorgehensweise muss Visual Studio 2010 oder höher auf dem Computer installiert und der Zugriff auf eine SQL Server-Instanz möglich sein, die die Beispieldatenbank "School" enthält. Weitere Informationen finden Sie unter Creating the School Sample Database.

In dieser exemplarischen Vorgehensweise wird davon ausgegangen, dass Sie über grundlegende Kenntnisse in Visual Studio, .NET Framework und entweder der Visual C#- oder der Visual Basic-Programmierung verfügen.

Generieren der Datei School.edmx

Zum Durchführen dieser Prozedur müssen Sie in Visual Studio ein neues WPF-Anwendungsprojekt geöffnet haben. In dieser Prozedur generieren Sie auf der Grundlage zweier Tabellen in der Beispieldatenbank School eine EDMX-Datei. Eine EDMX-Datei enthält das konzeptionelle Modell, das Speichermodell und die Zuordnung zwischen beiden Modellen. Weitere Informationen finden Sie unter Übersicht über die EDMX-Datei (Entity Framework). Entitätstypen im generierten konzeptionellen Modell besitzen skalare Eigenschaften, die Fremdschlüsselspalten in der Datenbank entsprechen.

So generieren Sie die EDMX-Datei

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektnamen, wählen Sie Hinzufügen aus, und klicken Sie dann auf Neues Element.

    Das Dialogfeld Neues Element hinzufügen wird angezeigt.

  2. Wählen Sie ADO.NET Entity Data Model aus, und klicken Sie auf Hinzufügen. (Wählen Sie unter Installierte Vorlagen die Option Daten, um die Anzahl der sichtbaren Vorlagen zu reduzieren.)

  3. Wählen Sie im Assistent für Entity Data Model die Option Aus Datenbank generieren aus, und klicken Sie auf Weiter.

  4. Stellen Sie im Dialogfeld Wählen Sie Ihre Datenverbindung aus eine Verbindung mit der Beispieldatenbank School her, und klicken Sie auf Weiter.

  5. Erweitern Sie im Dialogfeld Wählen Sie Ihre Datenbankobjekte aus den Knoten Tabellen, und wählen Sie die Tabellen Course und Department aus. Die Kontrollkästchen Generierte Objektnamen in den Singular oder Plural setzen und Fremdschlüsselspalten in das Modell einbeziehen sind hier standardmäßig aktiviert. Wenn Sie das Kontrollkästchen Fremdschlüsselspalten in das Modell einbeziehen aktiviert lassen, werden skalare Eigenschaften für Entitätstypen, die Fremdschlüsselspalten in der Datenbank zugeordnet sind, sowie Fremdschlüsselzuordnungen zwischen Entitäten erstellt. Das Deaktivieren dieses Kontrollkästchens bewirkt, dass unabhängige Zuordnungen zwischen Entitätstypen erstellt werden. Weitere Informationen finden Sie unter Association Element (CSDL) und ReferentialConstraint Element (CSDL).

    Wenn Sie das Kontrollkästchen Generierte Objektnamen in den Singular oder Plural setzen aktiviert lassen, werden für das Englische geltende Regeln für Plural- und Singularbildung auf die Namen der Entitätenmenge, des Entitätstyps und die Navigationseigenschaften angewendet. Weitere Informationen finden Sie unter Dialogfeld "Datenbankobjekte auswählen" (Entity Data Model-Assistent).

    In dieser exemplarischen Vorgehensweise wird davon ausgegangen, dass Sie die beiden Kontrollkästchen aktiviert lassen.

  6. Klicken Sie auf Fertig stellen.

    Dem Projekt wird eine EDMX-Datei hinzugefügt und im Entity Designer angezeigt. Zu sehen sind zwei Entitätstypen (Department und Course) mit einer 1:n-Zuordnung (1:*-Zuordnung) zwischen beiden. Die Zuordnung wird mithilfe einer referenziellen Einschränkung erstellt. Sie können dies überprüfen, wenn Sie die EDMX-Datei in einem XML-Editor öffnen:

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

    Weitere Informationen finden Sie unter ReferentialConstraint Element (CSDL).

Erstellen der Benutzeroberfläche

In dieser Prozedur fügen Sie der Anwendung Steuerelemente hinzu, die es Ihnen ermöglichen, Informationen zu Abteilungen und Kursen zu erstellen und zu aktualisieren.

So erstellen Sie die Benutzeroberfläche

  1. Wählen Sie im Menü Daten von Visual Studio den Befehl Datenquellen anzeigen aus.

    Der Bereich Datenquellen wird angezeigt.

  2. Klicken Sie auf die Registerkarte MainWindow.xaml, um die MainWindow-Entwurfsoberfläche anzuzeigen.

  3. Klicken Sie im Bereich Datenquellen auf die Courses-Datenquelle, und wählen Sie aus der Dropdownliste Details aus.

  4. Wiederholen Sie Schritt zwei für die Datenquelle Departments.

  5. Erweitern Sie im Bereich Datenquellen die Datenquelle Courses, klicken Sie auf das DepartmentID-Feld, und wählen Sie Keines aus.

  6. Erweitern Sie im Bereich Datenquellen die Datenquelle Departments, klicken Sie auf das Name-Feld, und wählen Sie ComboBox aus.

  7. Ziehen Sie die Datenquellen Courses und Departments auf die MainWindow-Entwurfsoberfläche.

    Raster-Steuerelemente für die Datenquellen Courses und Departments werden auf der MainWindow-Entwurfsoberfläche erstellt.

  8. Deaktivieren Sie im Fenster Eigenschaften für die Textfelder Department ID, Budget, Start Date und Administrator das Kontrollkästchen IsEnabled.

  9. Aktivieren Sie im Eigenschaftenfenster für das Kombinationsfeld Name das Kontrollkästchen IsEditable.

  10. Ziehen Sie aus der Toolbox ein Checkbox-Steuerelement auf die MainWindow-Entwurfsoberfläche. Ändern Sie den Namen des Checkbox-Steuerelements in newDepartment, und legen Sie seine Content-Eigenschaft auf New Department fest.

  11. Ziehen Sie aus der Toolbox ein Button-Steuerelement auf die MainWindow-Entwurfsoberfläche . Ändern Sie den Namen des Button-Steuerelements in addWithFKButton, und ändern Sie seine Content-Eigenschaft in Add (FK).

  12. Ziehen Sie aus der Toolbox ein Button-Steuerelement auf die MainWindow-Entwurfsoberfläche . Ändern Sie den Namen des Button-Steuerelements in addWithNavPropButton, und ändern Sie seine Content-Eigenschaft in Add (Nav Prop).

Die Benutzeroberfläche ist damit vollständig.

Hinzufügen von verknüpften Entitäten mithilfe von Fremdschlüsseleigenschaften

In dieser Prozedur fügen Sie der Anwendung Code hinzu, der es Ihnen ermöglicht, mithilfe von Fremdschlüsseleigenschaften neue Kurse und Abteilungen hinzuzufügen.

So fügen Sie mithilfe von Fremdschlüsseleigenschaften verknüpfte Entitäten hinzu

  1. Öffnen Sie die Datei MainWindow.xaml.vb oder MainWindow.xaml.cs, und fügen Sie die folgende Using-Anweisung (C#) oder Imports-Anweisung (Visual Basic) hinzu:

    Imports System.Data.Objects
    
    using System.Data.Objects;
    
  2. Fügen Sie der MainWindow-Klasse den folgenden Member hinzu. Dies ist der ObjectContext, dem Sie Objekte hinzufügen.

    Private context As SchoolEntities
    
    private SchoolEntities context;
    
  3. Ersetzen Sie den Code in der Window_Loaded-Methode durch den folgenden Code, der ein GridView-Steuerelement mit Abteilungen auffüllt:

    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. Doppelklicken Sie auf der MainWindow-Entwurfsoberfläche auf die Schaltfläche New Department.

    Der newDepartment_Checked-Ereignishandler wird in die CodeBehind-Datei eingefügt.

  5. Fügen Sie der newDepartment_Checked-Methode folgenden Code hinzu: Dies ermöglicht es Ihnen, dem ObjectContext eine neue Abteilung hinzuzufügen.

    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. Doppelklicken Sie auf der MainWindow-Entwurfsoberfläche auf die Schaltfläche Add (FK).

    Der addWithFKButton_Click-Ereignishandler wird in die CodeBehind-Datei eingefügt.

  7. Fügen Sie der addWithFKButton_Click-Methode folgenden Code hinzu: Beachten Sie, dass ein neuer Kurs einer Abteilung zugeordnet wird, indem die DepartmentID-Eigenschaft des neuen Kurses festgelegt wird.

    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(de-de,VS.100).gifHinweis:
Wenn Sie gleichzeitig einen neuen Kurs und eine neue Abteilung hinzufügen, werden ihre jeweiligen Navigationseigenschaften erst dann synchronisiert, wenn SaveChanges aufgerufen wird.Wenn Sie beispielsweise versuchen, über die Navigationseigenschaft des neuen Kurses vor dem Aufruf von SaveChanges auf die neue Abteilung zuzugreifen, wird NULL zurückgegeben.

Drücken Sie Crtl+F5, um das Programm auszuführen. Sie können der ausgewählten Abteilung einen neuen Kurs hinzufügen, indem Sie die Kursinformationen bearbeiten und dann auf Add (FK) klicken. Sie können einer neuen Abteilung einen neuen Kurs hinzufügen, indem Sie das Kontrollkästchen New Department aktivieren, die Kurs- und Abteilungsinformationen bearbeiten und dann auf Add (FK) klicken.

Hinzufügen von verknüpften Entitäten mithilfe von Navigationseigenschaften

In dieser Prozedur fügen Sie der Anwendung Code hinzu, der Ihnen ermöglicht, mithilfe von Navigationseigenschaften neue Kurse und Abteilungen hinzuzufügen.

So fügen Sie mithilfe von Navigationseigenschaften verknüpfte Entitäten hinzu

  1. Doppelklicken Sie auf der MainWindow-Entwurfsoberfläche auf die Schaltfläche Add (Nav Prop).

    Der addWithNavPropButton_Click-Ereignishandler wird in die CodeBehind-Datei eingefügt.

  2. Fügen Sie der addWithNavPropButton_Click-Methode folgenden Code hinzu: Beachten Sie, dass ein neuer Kurs einer Abteilung zugeordnet wird, indem die Department-Navigationseigenschaft des neuen Kurses festgelegt wird. Dadurch wird der neue Kurs außerdem dem ObjectContext hinzugefügt.

    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();
    

Drücken Sie Crtl+F5, um das Programm auszuführen. Sie können der ausgewählten Abteilung einen neuen Kurs hinzufügen, indem Sie die Kursinformationen bearbeiten und dann auf Add (Nav Prop) klicken. Sie können einer neuen Abteilung einen neuen Kurs hinzufügen, indem Sie das Kontrollkästchen New Department aktivieren, die Kurs- und Abteilungsinformationen bearbeiten und dann auf Add (Nav Prop) klicken.

Siehe auch

Aufgaben

Gewusst wie: Erstellen einer neuen EDMX-Datei (Entity Data Model-Tools)

Weitere Ressourcen

Working with Foreign Keys (Entity Framework)