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
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.
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.)
Wählen Sie im Assistent für Entity Data Model die Option Aus Datenbank generieren aus, und klicken Sie auf Weiter.
Stellen Sie im Dialogfeld Wählen Sie Ihre Datenverbindung aus eine Verbindung mit der Beispieldatenbank School her, und klicken Sie auf Weiter.
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.
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
Wählen Sie im Menü Daten von Visual Studio den Befehl Datenquellen anzeigen aus.
Der Bereich Datenquellen wird angezeigt.
Klicken Sie auf die Registerkarte
MainWindow.xaml
, um die MainWindow-Entwurfsoberfläche anzuzeigen.Klicken Sie im Bereich Datenquellen auf die Courses-Datenquelle, und wählen Sie aus der Dropdownliste Details aus.
Wiederholen Sie Schritt zwei für die Datenquelle Departments.
Erweitern Sie im Bereich Datenquellen die Datenquelle Courses, klicken Sie auf das DepartmentID-Feld, und wählen Sie Keines aus.
Erweitern Sie im Bereich Datenquellen die Datenquelle Departments, klicken Sie auf das Name-Feld, und wählen Sie ComboBox aus.
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.
Deaktivieren Sie im Fenster Eigenschaften für die Textfelder Department ID, Budget, Start Date und Administrator das Kontrollkästchen IsEnabled.
Aktivieren Sie im Eigenschaftenfenster für das Kombinationsfeld Name das Kontrollkästchen IsEditable.
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.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).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
Öffnen Sie die Datei
MainWindow.xaml.vb
oderMainWindow.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;
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;
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);
Doppelklicken Sie auf der MainWindow-Entwurfsoberfläche auf die Schaltfläche New Department.
Der
newDepartment_Checked
-Ereignishandler wird in die CodeBehind-Datei eingefügt.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; }
Doppelklicken Sie auf der MainWindow-Entwurfsoberfläche auf die Schaltfläche Add (FK).
Der
addWithFKButton_Click
-Ereignishandler wird in die CodeBehind-Datei eingefügt.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();
Hinweis: |
---|
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
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.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)