Compartir a través de


Cómo agregar y modificar objetos con herencia de tabla por jerarquía (Entity Framework)

Este ejemplo usa el modelo Entity Data Model (EDM) diseñado en el tema Cómo definir un modelo con herencia de tabla por jerarquía (Entity Framework).

Para crear un proyecto utilizando el modelo de herencia de tabla por jerarquía

  1. Cree un proyecto de aplicación de consola y agregue referencias a System.Data.Entity y System.Runtime.Serialization.

  2. Agregue una referencia a la biblioteca DLL generada con el modelo de herencia que se describe en el tema Cómo definir un modelo con herencia de tabla por jerarquía (Entity Framework).

  3. Agregue los esquemas del tema Cómo definir un modelo con herencia de tabla por jerarquía (Entity Framework) a la misma carpeta donde está el archivo ejecutable SchoolDataClient.

  4. Agregue un archivo de configuración de la aplicación con contenido como se muestra en el ejemplo siguiente.

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <connectionStrings><add name="SchoolDataLibContainer" 
       connectionString=
       "metadata=res://*/SchoolDataLib.csdl|
       res://*/SchoolDataLib.ssdl|
       res://*/SchoolDataLib.msl;provider=System.Data.SqlClient;
       provider connection string=&quot;
       Data Source=localhost;
       Initial Catalog=SchoolData;Integrated Security=True;
       MultipleActiveResultSets=True&quot;" 
       providerName="System.Data.EntityClient" />
      </connectionStrings>
    </configuration>
    

Para agregar nuevos tipos Instructor y Student derivados y modificar el tipo Instructor

  1. Cree una instancia del contexto del objeto SchoolDataEntities.

  2. Cree una instancia nueva del tipo Instructor y asigne datos a las propiedades de Instructor.

  3. Agregue la nueva instancia de Instructor al almacenamiento utilizando el método AddToPeople. El parámetro del método AddToPeople es el nombre de la nueva instancia de Instructor.

  4. Guarde los cambios.

  5. Cree una instancia nueva del tipo Student e inicialice las propiedades.

  6. Agréguela al almacenamiento y guarde los cambios.

  7. Cree un ObjectParameter para utilizarlo en una consulta de una instancia de Instructor con la propiedad LastName establecida en Griffin.

  8. Pruebe la consulta para comprobar que el elemento Instructor con esta propiedad existe en el almacenamiento.

  9. Consulte el elemento Instructor designado y asígnelo a una variable denominada changeInstructor.

  10. Asigne el valor Anderson a la propiedad LastName y guarde los cambios.

Ejemplo

El código siguiente agrega una instancia nueva de los tipos Instructor y Student. Después, consulta el elemento Instructor con el valor Griffin en LastName y cambia la propiedad LastName a Anderson.

Option Explicit On
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Xml
Imports System.Xml.Linq
Imports System.Text
Imports SchoolDataLib

Module Module1

    Sub Main()
        Try
            Using objectContext As SchoolDataLibContainer =
                                      New SchoolDataLibContainer()
                ' Display departments and administrators.
                For Each dept As Department In objectContext.Departments
                    Console.WriteLine("School: {0} Budget: {1}", _
                            dept.Name, dept.Budget)

                    ' Load associated contact reference if any.
                    dept.AdministratorReference.Load()
                    If dept.Administrator IsNot Nothing Then
                        Console.WriteLine("Administrator: {0} {1}", _
                            dept.Administrator.FirstName, _
                            dept.Administrator.LastName)
                    End If
                Next

                For Each eDept As DeptEngineering In _
                        objectContext.Departments.OfType(Of DeptEngineering)()
                    Console.WriteLine("{0} LabBudget: {1} FiberOp Budget: {2}", _
                        eDept.Name, eDept.LabBudget.ToString(), _
                        eDept.FiberOpticsBudget.ToString())
                Next

                Dim countDept As Integer = 0
                Dim newDept As DeptEngineering = New DeptEngineering()

                For Each dept As Department In objectContext.Departments
                    countDept = countDept + 1
                Next

                newDept.DepartmentID = countDept + 1
                newDept.Name = "Engineering School " + (countDept + 1).ToString()
                newDept.StartDate = DateTime.Now
                newDept.FiberOpticsBudget = 250000.0
                newDept.LabBudget = 400000.0
                newDept.Budget = newDept.FiberOpticsBudget + newDept.LabBudget

                ' Create new contact item to be 
                ' added as school administrator.
                Dim countPerson As Integer = 0
                For Each pers As Person In objectContext.People
                    countPerson = countPerson + 1
                Next

                Dim newAdmin As Administrator = New Administrator()
                newAdmin.PersonID = countPerson + 1
                newAdmin.FirstName = "Tony"
                newAdmin.LastName = "Allen"
                newAdmin.AdminDate = DateTime.Now - New TimeSpan(2000, 0, 0, 0)

                ' Assign the contact to Administrator property.
                newDept.Administrator = newAdmin

                ' Add admin and school to object context.
                objectContext.AddToPeople(newAdmin)
                objectContext.AddToDepartments(newDept)

                objectContext.SaveChanges()
            End Using

        Catch ex As System.Data.MappingException
            Console.WriteLine(ex.ToString())
        Catch ex As System.Data.CommandExecutionException
            Console.WriteLine(ex.ToString())
        Catch ex As System.Data.UpdateException
            Console.WriteLine(ex.ToString())
        End Try

    End Sub
End Module
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SchoolDataLibTPH;
using System.Data.Objects;
namespace SchoolDataLib
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                // Add new Instructor.
                using (SchoolDataLibContainer objectContext =
                                      new SchoolDataLibContainer())
                {
                    Instructor newInstructor =
                        new Instructor();
                    newInstructor.PersonID =
                            objectContext.People.Count<Person>() + 1;
                    newInstructor.FirstName = "Satomi";
                    newInstructor.LastName = "Hayakawa";

                    newInstructor.HireDate = DateTime.Now;

                    objectContext.AddToPeople(newInstructor);
                    objectContext.SaveChanges();

                    // Add new Student.
                    Student newStudent = new Student();
                    int count = objectContext.People.Count<Person>();
                    newStudent.PersonID = count + 1;
                    newStudent.FirstName = "Uzi";
                    newStudent.LastName = "Hefetz";
                    newStudent.EnrollmentDate = DateTime.Now;


                    objectContext.AddToPeople(newStudent);
                    objectContext.SaveChanges();

                    // Change the last name of an instructor.
                    ObjectParameter param =
                                  new ObjectParameter("p", "Hayakawa");
                    if (0 != objectContext.People.OfType<Instructor>().
                                  Where("it.LastName = @p",
                                  param).Count<Instructor>())
                    {
                        Instructor changeInstructor = 
                              objectContext.People.
                              OfType<Instructor>().Where(
                             "it.LastName = @p", param).First();
                        changeInstructor.LastName = "Anderson";
                        objectContext.SaveChanges();

                    }

                    objectContext.Connection.Close();
                }
            }

            catch (System.Data.MappingException e)
            {
                Console.WriteLine(e.ToString());
            }
            catch (System.Data.UpdateException e)
            {
                Console.WriteLine(e.ToString());
            }

        }
    }
}

Vea también

Tareas

Cómo definir un modelo con herencia de tabla por jerarquía (Entity Framework)
Cómo crear y ejecutar consultas de objeto con herencia de tabla por jerarquía (Entity Framework)