Поделиться через


Как добавить и изменить объекты с наследованием типа «одна таблица на иерархию» (платформа Entity Framework)

В этом примере используется модель EDM, подготовленная в разделе Как определить модель с наследованием типа «одна таблица на иерархию» (платформа Entity Framework).

Создание проекта с использованием модели наследования типа «одна таблица на иерархию»

  1. Создайте проект приложения командной строки и добавьте ссылки на System.Data.Entity и System.Runtime.Serialization.

  2. Добавьте ссылку на библиотеку, созданную из модели наследования в разделе Как определить модель с наследованием типа «одна таблица на иерархию» (платформа Entity Framework).

  3. Добавьте схемы из раздела Как определить модель с наследованием типа «одна таблица на иерархию» (платформа Entity Framework) в папку, в которой расположен исполняемый файл SchoolDataClient.

  4. Добавьте файл конфигурации приложения с содержимым, показанным в следующем примере.

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

Добавление новых производных типов Instructor и Student и изменение типа Instructor

  1. Создайте экземпляр контекста объекта SchoolDataEntities.

  2. Создайте новый экземпляр типа Instructor и установите его свойства.

  3. Добавьте новый экземпляр Instructor в хранилище с помощью метода AddToPeople. Параметром метода AddToPeople является имя нового экземпляра типа Instructor.

  4. Сохраните изменения.

  5. Создайте новый экземпляр типа Student и инициализируйте свойства.

  6. Добавьте его в хранилище и сохраните изменения.

  7. Создайте элемент ObjectParameter, используемый в запросе для экземпляра Instructor со свойством LastName, равным Griffin.

  8. Проверьте запрос, чтобы убедиться, что экземпляр Instructor с этим свойством существует в хранилище.

  9. Выполните запрос для заданного экземпляра Instructor и назначьте его переменной с именем changeInstructor.

  10. Установите свойство LastName в значение «Anderson» и сохраните изменения.

Примеры

В следующем коде добавляется новый экземпляр типа Instructor и тип Student. Затем запрашивается экземпляр Instructor, свойство LastName которого имеет значение «Griffin», и свойство LastName изменяется на «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());
            }

        }
    }
}

См. также

Задачи

Как определить модель с наследованием типа «одна таблица на иерархию» (платформа Entity Framework)
Как создавать и выполнять запросы объектов с помощью наследования типа «одна таблица на иерархию» (платформа Entity Framework)