Compartir a través de


Tutorial: Agregar entidades mediante propiedades de clave externa (Entity Framework)

En este tema se describe cómo generar un modelo conceptual con claves externas expuestas como propiedades de entidad y cómo escribir código para crear entidades y relaciones.

A partir de Visual Studio 2010, cuando se genera un modelo desde una base de datos existente, ADO.NET Entity Data Model Designer (Entity Designer) crea propiedades escalares en tipos de entidad que se corresponden con columnas de clave externa de la base de datos. Las propiedades de clave externa se pueden usar para crear y modificar relaciones entre tipos de entidad. De forma predeterminada, Entity Designer también genera propiedades de navegación en tipos de entidad que se pueden usar para crear y modificar relaciones. En este tutorial se muestra cómo crear relaciones mediante propiedades de clave externa y propiedades de navegación. La creación y administración de relaciones mediante propiedades de clave externa simplifica muchos escenarios comunes. Por ejemplo, los escenarios de enlace de datos, control de simultaneidad y n-niveles se pueden simplificar mediante las propiedades de clave externa para crear y administrar relaciones. Para obtener más información, vea Defining and Managing Relationships.

Requisitos previos

Para completar este tutorial, debe tener Visual Studio 2010 o posterior instalado en su equipo y tener acceso a una instancia de SQL Server que contenga la base de datos de ejemplo School. Para obtener más información, vea Creating the School Sample Database.

En este tutorial se supone que el usuario tiene conocimientos básicos de Visual Studio, de .NET Framework y de programación en Visual C# o Visual Basic.

Generar el archivo .edmx

Para completar este procedimiento, debe tener un proyecto nuevo de la aplicación WPF abierto en Visual Studio. En este procedimiento, generará un archivo .edmx basado en dos tablas de la base de datos de ejemplo School. Un archivo .edmx contiene un modelo conceptual, un modelo de almacenamiento y la asignación entre ellos. Para obtener más información, vea Información general sobre el archivo .edmx (Entity Framework). Los tipos de entidad del modelo conceptual generado tendrán propiedades escalares que se corresponden con las columnas de clave externa de la base de datos.

Para generar el archivo .edmx

  1. En el Explorador de soluciones, haga clic con el botón secundario en el nombre del proyecto, elija Agregar y, a continuación, seleccione Nuevo elemento.

    Aparece el cuadro de diálogo Agregar nuevo elemento.

  2. Seleccione ADO.NET Entity Data Model y haga clic en Agregar. (Para reducir el número de plantillas visibles, elija Datos debajo de Plantillas instaladas).

  3. En el Asistente para Entity Data Model, seleccione Generar desde la base de datos y haga clic en Siguiente.

  4. En el cuadro de diálogo Elegir la conexión de datos, conéctese a la base de datos de ejemplo School y haga clic en Siguiente.

  5. En el cuadro de diálogo Elija los objetos de base de datos, expanda el nodo Tables y seleccione las tablas Course y Department. Tenga en cuenta que las casillas Poner en plural o en singular los nombres de objeto generados e Incluir columnas de clave externa en el modelo están activadas de forma predeterminada. Si se deja activada la casilla Incluir columnas de clave externa en el modelo, se crearán propiedades escalares en los tipos de entidad que se asignen a las columnas de clave externa de la base de datos y se crearán asociaciones de clave externa entre las entidades. Si se desactiva esta casilla, se crearán asociaciones independientes entre los tipos de entidad. Para obtener más información, vea Association Element (CSDL) y ReferentialConstraint Element (CSDL).

    Si se deja la casilla Poner en plural o en singular los nombres de objeto generados activada, se aplicarán las reglas del idioma inglés de plurales y singulares a los nombres del conjunto de entidades, del tipo de entidad y de la propiedad de navegación. Para obtener más información, vea Cuadro de diálogo Elija los objetos de base de datos (Asistente para Entity Data Model).

    En este tutorial se presupone que el usuario continua con ambas casillas activadas.

  6. Haga clic en Finalizar.

    Se agrega un archivo .edmx al proyecto y se muestra en Entity Designer. La presentación muestra dos tipos de entidad (Department y Course) con una asociación uno a varios (1:*) entre ellos. La asociación se crea mediante una restricción referencial y se puede ver abriendo el archivo .edmx en el 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>
    

    Para obtener más información, vea ReferentialConstraint Element (CSDL).

Crear la interfaz de usuario

En este procedimiento, va a agregar controles a la aplicación que le permitan crear y actualizar la información sobre departamentos y cursos.

Para crear la interfaz de usuario

  1. En el menú Datos de Visual Studio, seleccione Mostrar orígenes de datos.

    Aparece el recuadro Orígenes de datos.

  2. Haga clic en la pestaña MainWindow.xaml para que se muestre la superficie de diseño MainWindow.

  3. En el recuadro Orígenes de datos, haga clic en el origen de datos Courses y seleccione Details en la lista desplegable.

  4. Repita el paso dos para el origen de datos Departments.

  5. En el recuadro Orígenes de datos, expanda el origen de datos Courses, haga clic en el campo DepartmentID y seleccione None.

  6. En el recuadro Orígenes de datos, expanda el origen de datos Departments, haga clic en el campo Name y seleccione ComboBox.

  7. Arrastre los orígenes de datos Courses y Departments a la superficie de diseño MainWindow.

    Se crean controles Grid para los orígenes de datos Courses y Departments en la superficie de diseño MainWindow.

  8. Desactive la casilla IsEnabled de la ventana Properties de los cuadros de texto Department ID, Budget, Start Date y Administrator.

  9. Active la casilla IsEditable en la ventana Properties del cuadro combinado Name.

  10. Desde el Cuadro de herramientas, arrastre un control Checkbox a la superficie de diseño MainWindow. Cambie el nombre del control Checkbox a newDepartment y establezca su propiedad Content en New Department.

  11. Desde el Cuadro de herramientas, arrastre un control Button a la superficie de diseño MainWindow. Cambie el nombre del control Button a addWithFKButton y su propiedad Content a Add (FK).

  12. Desde el Cuadro de herramientas, arrastre un control Button a la superficie de diseño MainWindow. Cambie el nombre del control Button a addWithNavPropButton y su propiedad Content a Add (Nav Prop).

La interfaz de usuario está completa ahora.

Agregar entidades relacionadas mediante propiedades de clave externa

En este procedimiento agregará código a la aplicación que le permitirá agregar nuevos cursos y departamentos mediante propiedades de clave externa.

Para agregar entidades relacionadas mediante propiedades de clave externa

  1. Abra el archivo MainWindow.xaml.vb o MainWindow.xaml.cs y agregue la siguiente instrucción Using (C#) o Imports (Visual Basic):

    Imports System.Data.Objects
    
    using System.Data.Objects;
    
  2. Agregue el siguiente miembro a la clase MainWindow. Esta es la clase ObjectContext a la que agregará objetos.

    Private context As SchoolEntities
    
    private SchoolEntities context;
    
  3. Reemplace el código del método Window_Loaded por el siguiente código que rellena un control GridView con departamentos:

    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. En la superficie de diseño MainWindow, haga doble clic en el botón New Department.

    El método newDepartment_Checked se agrega al archivo de código subyacente.

  5. Agregue el código siguiente al método newDepartment_Checked. De esta forma, podrá agregar un nuevo departamento a la clase 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. En la superficie de diseño MainWindow, haga doble clic en el botón Add (FK).

    El método addWithFKButton_Click se agrega al archivo de código subyacente.

  7. Agregue el código siguiente al método addWithFKButton_Click. Observe que se asocia un nuevo curso con un departamento si se establece la propiedad DepartmentID del nuevo curso.

    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(es-es,VS.100).gifNota:
Si agrega un nuevo curso y un nuevo departamento a la vez, sus propiedades de navegación no se sincronizan hasta que se haya llamado a un método SaveChanges.Por ejemplo, si intenta tener acceso al nuevo departamento a través de la propiedad de navegación en el nuevo curso antes de llamar al método SaveChanges, se devuelve null.

Presione Crtl+F5 para ejecutar el programa. Puede agregar un nuevo curso al departamento seleccionado si edita la información del curso y hace clic en Add (FK). Puede agregar un nuevo curso a un nuevo departamento si activa la casilla New Department, edita la información del curso y del departamento y hace clic en Add (FK).

Agregar entidades relacionadas mediante las propiedades de navegación

En este procedimiento agregará código a la aplicación que le permite agregar nuevos cursos y departamentos mediante propiedades de navegación.

Título del procedimiento

  1. En la superficie de diseño MainWindow, haga doble clic en el botón Add (Nav Prop).

    El método addWithNavPropButton_Click se agrega al archivo de código subyacente.

  2. Agregue el código siguiente al método addWithNavPropButton_Click. Observe que se asocia un nuevo curso con un departamento si se establece la propiedad de navegación Department del nuevo curso. De esta forma, también se agrega el nuevo curso a la clase 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();
    

Presione Crtl+F5 para ejecutar el programa. Puede agregar un nuevo curso al departamento seleccionado si edita la información del curso y hace clic en Add (Nav Prop). Puede agregar un nuevo curso a un nuevo departamento si activa la casilla New Department, edita la información del curso y del departamento, y hace clic en Add (Nav Prop).

Vea también

Tareas

Cómo: Crear un nuevo archivo .edmx (Entity Data Model Tools)

Otros recursos

Working with Foreign Keys (Entity Framework)