Как добавить и изменить объекты с наследованием типа «одна таблица на тип» (платформа Entity Framework)
В этом разделе используется модель EDM, определенная в разделе Как задать модель с наследованием «таблица для типа» (платформа Entity Framework). Он показывает, как добавить экземпляр производного типа в иерархии наследования типа «одна таблица на тип».
Создание проекта с использованием наследования типа «одна таблица на тип»
Создайте проект приложения командной строки с именем SchoolDataClient и добавьте ссылки на System.Data.Entity и System.Runtime.Serialization.
Добавьте ссылку на DLL-библиотеку, созданную на основе иерархии наследования, описанной в разделе Как задать модель с наследованием «таблица для типа» (платформа 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>
Добавление экземпляра производного типа
Создайте экземпляр типа DeptEngineering с именем newDept.
Инициализируйте данные свойств экземпляра newDept.
Создайте новый экземпляр типа Person.
Для свойства PersonCategory укажите значение 3, что означает категорию Administrator.
Инициализируйте свойства экземпляра newAdmin.
Свойству Administrator экземпляра newDept присвойте значение Person.
Добавьте в хранилище экземпляры newDept и newAdmin и сохраните изменения.
Примеры
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("People", newAdmin)
objectContext.AddToDepartments("Departments", 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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SchoolDataLib;
namespace SchoolDataClient
{
class Program
{
static void Main(string[] args)
{
try
{
using (SchoolDataLibContainer objectContext =
new SchoolDataLibContainer())
{
DeptEngineering newDept =
new DeptEngineering();
int countDept =
objectContext.Departments.Count<Department>();
newDept.DepartmentID = countDept + 1;
newDept.Name = "Engineering School " +
(countDept + 1).ToString();
newDept.StartDate = DateTime.Now;
newDept.FiberOpticsBudget = 250000.00M;
newDept.LabBudget = 400000.00M;
newDept.Budget = newDept.FiberOpticsBudget +
newDept.LabBudget;
// Create new contact item to be
// added as school administrator.
int countPerson = objectContext.People.Count<Person>();
Administrator newAdmin = new Administrator();
newAdmin.PersonID = countPerson + 1;
newAdmin.FirstName = "Jesper";
newAdmin.LastName = "Aaberg";
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();
}
}
catch (System.Data.MappingException e)
{
Console.WriteLine(e.ToString());
}
catch (System.Data.UpdateException e)
{
Console.WriteLine(e.ToString());
}
}
}
}
См. также
Задачи
Как задать модель с наследованием «таблица для типа» (платформа Entity Framework)
Как создавать и выполнять запросы объектов с помощью наследования «одна таблица на тип» (платформа Entity Framework)