Condividi tramite


Procedura dettagliata: Aggiunta di entità utilizzando le proprietà di chiave esterna (Entity Framework)

In questo argomento viene descritto come generare un modello concettuale con le chiavi esterne esposte come proprietà dell'entità e come scrivere il codice per la creazione di entità e relazioni.

A partire da Visual Studio 2010, quando si genera un modello da un database esistente, ADO.NET Entity Data Model Designer (Entity Designer) crea le proprietà scalari per i tipi di entità corrispondenti alle colonne di chiavi esterne del database. Le proprietà di chiave esterna possono essere utilizzate per creare e modificare le relazioni tra i tipi di entità. Per impostazione predefinita, Entity Designer genera anche le proprietà di navigazione per i tipi di entità che possono essere utilizzati per creare e modificare le relazioni. In questa procedura dettagliata viene descritto come si creano le relazioni tramite le proprietà di navigazione e le proprietà di chiave esterna. La creazione e la gestione delle relazioni tramite le proprietà di chiave esterna semplificano molti scenari comuni. Ad esempio, scenari di associazione dati, controllo di concorrenza e scenari a più livelli possono essere resi più semplice tramite l'utilizzo delle proprietà di chiave esterna per creare e gestire le relazioni. Per ulteriori informazioni, vedere Defining and Managing Relationships.

Prerequisiti

Per completare questa procedura dettagliata è necessario che nel computer sia installato Visual Studio 2010 o versione successiva e che sia disponibile l'accesso a un'istanza SQL Server contenente il database di esempio School. Per ulteriori informazioni, vedere Creating the School Sample Database.

In questa procedura dettagliata si presuppone che si disponga di una conoscenza di base di Visual Studio, .NET Framework e della programmazione in Visual C# o Visual Basic.

Generazione del file con estensione edmx

Per completare questa procedura, è necessario aprire un nuovo progetto Applicazione WPF in Visual Studio. In questa procedura si genererà un file con estensione edmx basato su due tabelle del database di esempio School. Un file con estensione edmx contiene un modello concettuale, un modello di archiviazione e il mapping tra i due modelli. Per ulteriori informazioni, vedere Panoramica sui file con estensione edmx (Entity Framework). I tipi di entità del modello concettuale generato disporranno di proprietà scalari che corrispondono alle colonne di chiavi esterne del database.

Per generare il file con estensione edmx

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse sul nome del progetto, scegliere Aggiungi e selezionare Nuovo elemento.

    Verrà visualizzata la finestra di dialogo Aggiungi nuovo elemento.

  2. Selezionare ADO.NET Entity Data Model e fare clic su Aggiungi. Per ridurre il numero di modelli visibili, scegliere Dati in Modelli installati.

  3. Nella Procedura guidata Entity Data Model, selezionare Genera da database e fare clic su Avanti.

  4. Nella Finestra di dialogo Scegliere la connessione dati connettersi al database di esempio School e fare clic su Avanti.

  5. Nella Finestra di dialogo Seleziona oggetti di database espandere il nodo Tabelle e selezionare le tabelle Course e Department. Notare che le caselle di controllo Rendi plurali o singolari i nomi degli oggetti generati e Includi colonne di chiavi esterne nel modello sono selezionate per impostazione predefinita. Lasciando la casella di controllo Includi colonne di chiavi esterne nel modello selezionata, verranno create le proprietà scalari per i tipi di entità mappati alle colonne di chiavi esterne del database e le associazioni di chiavi esterne tra le entità. Deselezionando questa casella di controllo tra i tipi di entità verranno create associazioni indipendenti. Per ulteriori informazioni, vedere Association Element (CSDL) e ReferentialConstraint Element (CSDL).

    Lasciando la casella di controllo Rendi plurali o singolari i nomi degli oggetti generati selezionata, le regole della lingua inglese relative ai plurali e singolari verranno applicate ai nomi di proprietà di navigazione, tipi di entità e set di entità. Per ulteriori informazioni, vedere Finestra di dialogo Scegli oggetti di database (procedura guidata Entity Data Model).

    In questa procedura dettagliata si presuppone che entrambe le caselle di controllo siano selezionate.

  6. Scegliere Fine.

    Un file con estensione edmx viene aggiunto al progetto e viene visualizzato in Entity Designer. La visualizzazione mostra due tipi di entità (Department e Course) con l'associazione uno a molti (1: *) tra loro. L'associazione viene creata utilizzando un vincolo referenziale e può essere visualizzata aprendo il file con estensione edmx nell'Editor 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>
    

    Per ulteriori informazioni, vedere ReferentialConstraint Element (CSDL).

Creazione dell'interfaccia utente

In questa procedura vengono aggiunti controlli all'applicazione che consentono di creare e aggiornare le informazioni su reparti e corsi.

Per creare l'interfaccia utente

  1. Scegliere Mostra origini dati dal menu Dati di Visual Studio.

    Viene visualizzato il riquadro Origini dati.

  2. Fare clic sulla scheda MainWindow.xaml per visualizzare l'area di progettazione MainWindow.

  3. Nel riquadro Origini dati fare clic sull'origine dati Courses, quindi selezionare Dettagli nell'elenco a discesa.

  4. Ripetere il passaggio due per l'origine dati Departments.

  5. Nel riquadro Origini dati, espandere l'origine dati Courses, fare clic sul campo DepartmentID e selezionare Nessuno.

  6. Nel riquadro Origini dati, espandere l'origine dati Departments, fare clic sul campo Name e selezionare ComboBox.

  7. Trascinare le origini dati Courses e Departments sull'area di progettazione MainWindow.

    Nell'area di progettazione MainWindow vengono creati i controlli Griglia per le origini dati Courses e Departments.

  8. Deselezionare la casella di controllo IsEnabled nella finestra Proprietà per le caselle di testo Department ID, Budget, Start Date e Administrator.

  9. Selezionare la casella di controllo IsEditable nella finestra Proprietà per la casella combinata Name.

  10. Dalla Casella degli strumenti, trascinare un controllo Casella di controllo sull'area di progettazione MainWindow. Impostare il nome del controllo Casella di controllo su newDepartment ed impostare la proprietà Contenuto su New Department.

  11. Dalla Casella degli strumenti, trascinare un controllo Pulsante sull'area di progettazione MainWindow. Impostare il nome del controllo Pulsante su addWithFKButton e impostare la proprietà Contenuto su Add (FK).

  12. Dalla Casella degli strumenti, trascinare un controllo Pulsante sull'area di progettazione MainWindow. Impostare il nome del controllo Pulsante su addWithNavPropButton e impostare la proprietà Contenuto su Add (Nav Prop).

L'interfaccia utente è ora completa.

Aggiunta di entità correlate tramite proprietà di chiave esterna

In questa procedura verrà aggiunto il codice all'applicazione che consentirà di aggiungere nuovi corsi e reparti tramite le proprietà di chiave esterna.

Per aggiungere entità correlate tramite proprietà di chiave esterna

  1. Aprire il file MainWindow.xaml.vb o MainWindow.xaml.cs e aggiungere la seguente istruzione Using (C#) o Imports (Visual Basic):

    Imports System.Data.Objects
    
    using System.Data.Objects;
    
  2. Aggiungere il seguente membro alla classe MainWindow. Si tratta dell'elemento ObjectContext a cui verranno aggiunti gli oggetti.

    Private context As SchoolEntities
    
    private SchoolEntities context;
    
  3. Sostituire il codice nel metodo Window_Loaded con il seguente codice che popola un controllo GridView con i reparti:

    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. Sull'area di progettazione MainWindow, fare doppio clic sul pulsante New Department.

    Il metodo newDepartment_Checked viene aggiunto al file code-behind.

  5. Aggiungere al metodo newDepartment_Checked il seguente codice. In tal modo sarà possibile aggiungere un nuovo reparto a 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. Sull'area di progettazione MainWindow, fare doppio clic sul pulsante Add (FK).

    Il metodo addWithFKButton_Click viene aggiunto al file code-behind.

  7. Aggiungere al metodo addWithFKButton_Click il seguente codice. Notare che un nuovo corso viene associato a un reparto impostando la proprietà DepartmentID del nuovo corso.

    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(it-it,VS.100).gifNota:
Se si aggiungono contemporaneamente un nuovo corso e un nuovo reparto, le proprietà di navigazione non vengono sincronizzate fino a che non viene chiamato SaveChanges.Ad esempio, se si tenta di accedere al nuovo reparto tramite la proprietà di navigazione sul nuovo corso prima di chiamare SaveChanges, viene restituito null.

Premere Crtl+F5 per eseguire il programma. È possibile aggiungere un nuovo corso al reparto selezionato modificando le informazioni sul corso e facendo clic su Add (FK). È possibile aggiungere un nuovo corso a un nuovo reparto selezionando la casella di controllo New Department, modificando le informazioni sul corso e sul reparto e facendo clic su Add (FK).

Aggiunta di entità correlate tramite proprietà di navigazione

In questa procedura verrà aggiunto il codice all'applicazione che consentirà di aggiungere nuovi corsi e reparti tramite le proprietà di navigazione.

Titolo della procedura

  1. Sull'area di progettazione MainWindow, fare doppio clic sul pulsante Add (Nav Prop).

    Il metodo addWithNavPropButton_Click viene aggiunto al file code-behind.

  2. Aggiungere al metodo addWithNavPropButton_Click il seguente codice. Notare che un nuovo corso viene associato a un reparto impostando la proprietà di navigazione Department del nuovo corso. Con questa operazione si aggiunge inoltre il nuovo corso a 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();
    

Premere Crtl+F5 per eseguire il programma. È possibile aggiungere un nuovo corso al reparto selezionato modificando le informazioni sul corso e facendo clic su Add (Nav Prop). È possibile aggiungere un nuovo corso a un nuovo reparto selezionando la casella di controllo New Department, modificando le informazioni sul corso e sul reparto e facendo clic su Add (Nav Prop).

Vedere anche

Attività

Procedura: creare un nuovo file con estensione edmx (strumenti di Entity Data Model)

Altre risorse

Working with Foreign Keys (Entity Framework)