Table-Per-Type 継承でオブジェクトを追加および変更する方法 (Entity Framework)
このトピックでは、トピック「Table-Per-Type 継承でモデルを定義する方法 (Entity Framework)」で定義された Entity Data Model (EDM) を使用して、派生型のインスタンスを Table-Per-Type 継承階層に追加する方法を示します。
Table-Per-Type 継承を使用してプロジェクトを作成するには
SchoolDataClient という名前のコンソール アプリケーション プロジェクトを作成し、System.Data.Entity および System.Runtime.Serialization への参照を追加します。
「Table-Per-Type 継承でモデルを定義する方法 (Entity Framework)」で説明されている継承階層からビルドされた DLL への参照を追加します。
トピック「Table-Per-Type 継承でモデルを定義する方法 (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>
派生型のインスタンスを追加するには
newDept という名前の DeptEngineering 型のインスタンスを作成します。
newDept のプロパティのデータを初期化します。
Person 型の新しいインスタンスを作成します。
PersonCategory プロパティを 3 に割り当てて、Administrator カテゴリを指定します。
newAdmin のプロパティを初期化します。
newDept の Administrator プロパティに新しい 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());
}
}
}
}
参照
処理手順
Table-Per-Type 継承でモデルを定義する方法 (Entity Framework)
Table-Per-Type 継承を使用してオブジェクト クエリを作成および実行する方法 (Entity Framework)