How to: Add and Modify Objects with Table-per-Type Inheritance (Entity Framework)
This topic uses the Entity Data Model (EDM) defined in the topic How to: Define a Model with Table-per-Type Inheritance (Entity Framework). It demonstrates how to add an instance of the derived type in a Table-per-Type inheritance hierarchy.
To create a project using Table-Per-Type inheritance
Create a console application project named SchoolDataClient and add references to System.Data.Entity and System.Runtime.Serialization.
Add a reference to the dll built from the inheritance hierarchy described in How to: Define a Model with Table-per-Type Inheritance (Entity Framework).
Add the schemas from the topic How to: Define a Model with Table-per-Type Inheritance (Entity Framework) to the same folder as the SchoolDataClient executable.
Add an application configuration file to the project with the following content.
<?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>
To add an instance of the derived type
Create an instance of the DeptEngineering type named newDept.
Initialize the data of properties of newDept.
Create a new instance of the Person type.
Assign the PersonCategory property to 3 to indicate the Administrator category.
Initialize the properties of newAdmin.
Assign the new Person to the Administrator property of newDept.
Add newDept and newAdmin to storage and save changes.
Example
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());
}
}
}
}
See Also
Tasks
How to: Define a Model with Table-per-Type Inheritance (Entity Framework)
How to: Create and Execute Object Queries using Table-per-Type Inheritance (Entity Framework)