Как добавить и изменить объекты с наследованием типа «одна таблица на иерархию» (платформа Entity Framework)
В этом примере используется модель EDM, подготовленная в разделе Как определить модель с наследованием типа «одна таблица на иерархию» (платформа Entity Framework).
Создание проекта с использованием модели наследования типа «одна таблица на иерархию»
Создайте проект приложения командной строки и добавьте ссылки на System.Data.Entity и System.Runtime.Serialization.
Добавьте ссылку на библиотеку, созданную из модели наследования в разделе Как определить модель с наследованием типа «одна таблица на иерархию» (платформа Entity Framework).
Добавьте схемы из раздела Как определить модель с наследованием типа «одна таблица на иерархию» (платформа Entity Framework) в папку, в которой расположен исполняемый файл SchoolDataClient.
Добавьте файл конфигурации приложения с содержимым, показанным в следующем примере.
<?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=" Data Source=localhost; Initial Catalog=SchoolData;Integrated Security=True; MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" /> </connectionStrings> </configuration>
Добавление новых производных типов Instructor и Student и изменение типа Instructor
Создайте экземпляр контекста объекта SchoolDataEntities.
Создайте новый экземпляр типа Instructor и установите его свойства.
Добавьте новый экземпляр Instructor в хранилище с помощью метода AddToPeople. Параметром метода AddToPeople является имя нового экземпляра типа Instructor.
Сохраните изменения.
Создайте новый экземпляр типа Student и инициализируйте свойства.
Добавьте его в хранилище и сохраните изменения.
Создайте элемент ObjectParameter, используемый в запросе для экземпляра Instructor со свойством LastName, равным Griffin.
Проверьте запрос, чтобы убедиться, что экземпляр Instructor с этим свойством существует в хранилище.
Выполните запрос для заданного экземпляра Instructor и назначьте его переменной с именем changeInstructor.
Установите свойство 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)