次の方法で共有


Table-Per-Hierarchy 継承でオブジェクトを追加および変更する方法 (Entity Framework)

この例では、トピック「Table-Per-Hierarchy 継承でモデルを定義する方法 (Entity Framework)」で設計された Entity Data Model (EDM) を使用します。

Table-Per-Hierarchy 継承モデルを使用してプロジェクトを作成するには

  1. コンソール アプリケーション プロジェクトを作成し、System.Data.Entity および System.Runtime.Serialization への参照を追加します。

  2. トピック「Table-Per-Hierarchy 継承でモデルを定義する方法 (Entity Framework)」に説明されている継承モデルからビルドされた DLL への参照を追加します。

  3. トピック「Table-Per-Hierarchy 継承でモデルを定義する方法 (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 型の新しいインスタンスを作成し、データを Instructor プロパティに割り当てます。

  3. AddToPeople メソッドを使用して、Instructor の新しいインスタンスを追加します。AddToPeople メソッドのパラメータは、新しい Instructor インスタンスの名前になります。

  4. 変更を保存します。

  5. Student 型の新しいインスタンスを作成し、プロパティを初期化します。

  6. ストレージに追加し、変更を保存します。

  7. LastName プロパティが Griffin である Instructor インスタンスのクエリで使用する ObjectParameter を作成します。

  8. このプロパティを持つ Instructor がストレージに存在することを確認するためのクエリをテストします。

  9. 指定した Instructor のクエリを実行し、changeInstructor という名前の変数を割り当てます。

  10. LastName プロパティに Anderson を割り当て、変更を保存します。

以下のコードでは、Instructor 型と Student 型の新しいインスタンスを追加します。次に、Griffin の LastName に対して Instructor のクエリを実行し、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());
            }

        }
    }
}

参照

処理手順

Table-Per-Hierarchy 継承でモデルを定義する方法 (Entity Framework)
Table-Per-Hierarchy 継承を使用してオブジェクト クエリを作成および実行する方法 (Entity Framework)