次の方法で共有


Entity Framework 4.0 の新機能

作成者: Tom Dykstra

このチュートリアル シリーズは、Entity Framework チュートリアル シリーズを使用してはじめにによって作成された Contoso University Web アプリケーションに基づいています。 以前のチュートリアルを完了していない場合は、このチュートリアルの開始点として、作成 したアプリケーションをダウンロード できます。 完全なチュートリアル シリーズによって作成された アプリケーションをダウンロード することもできます。 チュートリアルについて質問がある場合は、 ASP.NET Entity Framework フォーラムに投稿できます。

前のチュートリアルでは、Entity Framework を使用する Web アプリケーションのパフォーマンスを最大化するためのいくつかの方法について説明しました。 このチュートリアルでは、Entity Framework のバージョン 4 で最も重要な新機能をいくつか確認し、すべての新機能のより完全な概要を提供するリソースへのリンクを示します。 このチュートリアルで強調表示されている機能は次のとおりです。

  • 外部キーの関連付け。
  • ユーザー定義 SQL コマンドの実行。
  • モデルファースト開発。
  • POCO のサポート。

さらに、このチュートリアルでは、Entity Framework の次のリリースで提供される機能である コードファースト開発について簡単に説明します。

チュートリアルを開始するには、Visual Studio を起動し、前のチュートリアルで使用していた Contoso University Web アプリケーションを開きます。

Foreign-Keyの関連付け

Entity Framework のバージョン 3.5 にはナビゲーション プロパティが含まれていましたが、データ モデルに外部キー プロパティは含まれていませんでした。 たとえば、テーブルの CourseIDStudentGrade 列と StudentID 列はエンティティからStudentGrade省略されます。

Image01

このアプローチの理由は、厳密に言えば、外部キーは物理的な実装の詳細であり、概念データ モデルに属していないということです。 ただし、実際的には、外部キーに直接アクセスできる場合は、コード内のエンティティを操作する方が簡単です。

データ モデルの外部キーでコードを簡略化する方法の例については、 DepartmentsAdd.aspx ページをコーディングせずにコーディングする方法を検討してください。 エンティティではDepartmentAdministrator プロパティは エンティティ内の PersonPersonID対応する外部キーです。 新しい部門とその管理者の間の関連付けを確立するために、データ送信コントロールのイベント ハンドラーで ItemInserting プロパティの値Administratorを設定する必要がありました。

protected void DepartmentsDetailsView_ItemInserting(object sender, DetailsViewInsertEventArgs e)
{
    e.Values["Administrator"] = administratorsDropDownList.SelectedValue;
}

データ モデルに外部キーがない場合は、エンティティがエンティティ セットに追加される前にエンティティ自体への参照をItemInserting取得するために、データ バインド コントロールのイベントではなく、データ ソース コントロールのイベントを処理Insertingします。 その参照がある場合は、次の例のようにコードを使用して関連付けを確立します。

departmentEntityToBeInserted.PersonReference.EntityKey = new System.Data.EntityKey("SchoolEntities.Departments", "PersonID", Convert.ToInt32(administratorsDropDownList.SelectedValue));
departmentEntityToBeInserted.Person = context.People.Single(p => p.PersonID == Convert.ToInt32(administratorsDropDownList.SelectedValue));

外部キーの関連付けに関する Entity Framework チームのブログ投稿でわかるように、コードの複雑さの違いがはるかに大きい場合もあります。 より単純なコードのために概念データ モデルの実装の詳細を使用することを希望するユーザーのニーズを満たすために、Entity Framework では、データ モデルに外部キーを含めるオプションが提供されるようになりました。

Entity Framework の用語では、外部キーをデータ モデルに含める場合は 外部キーの関連付けを使用し、外部キーを除外する場合は 独立した関連付けを使用します。

User-Defined SQL コマンドの実行

以前のバージョンの Entity Framework では、独自の SQL コマンドをその場で作成して実行する簡単な方法はありませんでした。 Entity Framework で動的に生成された SQL コマンドか、ストアド プロシージャを作成して関数としてインポートする必要がありました。 バージョン 4 では、 クラスをObjectContext追加ExecuteStoreQueryExecuteStoreCommand、 メソッドを使用して、任意のクエリをデータベースに直接渡すのを容易にします。

Contoso University の管理者が、ストアド プロシージャを作成してデータ モデルにインポートするプロセスを実行しなくても、データベースで一括変更を実行できるようにするとします。 最初の要求は、データベース内のすべてのコースのクレジット数を変更できるページ用です。 Web ページで、すべての CourseCredits の列の値を乗算するために使用する数値を入力できるようにする必要があります。

Site.Master マスター ページを使用する新しいページを作成し、UpdateCredits.aspx という名前を付けます。 次に、 という名前Content2のコントロールに次のマークアップをContent追加します。

<h2>Update Credits</h2>
    Enter the number to multiply the current number of credits by: 
    <asp:TextBox ID="CreditsMultiplierTextBox" runat="server"></asp:TextBox>
    <br /><br />
    <asp:Button ID="ExecuteButton" runat="server" Text="Execute" OnClick="ExecuteButton_Click" /><br /><br />
    Rows affected:
    <asp:Label ID="RowsAffectedLabel" runat="server" Text="0" ViewStateMode="Disabled"></asp:Label><br /><br />

このマークアップは、 TextBox ユーザーが乗数の値を入力できるコントロール、 Button コマンドを実行するためにクリックするコントロール、影響 Label を受ける行数を示すコントロールを作成します。

UpdateCredits.aspx.cs を開き、次usingのステートメントとボタンのClickイベントのハンドラーを追加します。

using ContosoUniversity.DAL;
protected void ExecuteButton_Click(object sender, EventArgs e)
{
    using (SchoolEntities context = new SchoolEntities())
    {
        RowsAffectedLabel.Text = context.ExecuteStoreCommand("UPDATE Course SET Credits = Credits * {0}", CreditsMultiplierTextBox.Text).ToString();
    }
}

このコードでは、テキスト ボックスの 値を使用して SQL Update コマンドを実行し、 ラベルを使用して影響を受ける行数を表示します。 ページを実行する前に、 Courses.aspx ページを実行して、一部のデータの "before" 画像を取得します。

Image02

UpdateCredits.aspx を実行し、乗数として「10」と入力し、[実行] をクリックします。

Image03

Courses.aspx ページをもう一度実行して、変更されたデータを確認します。

Image04

(クレジットの数を元の値に戻す場合は、UpdateCredits.aspx.cs で ページを にCredits / {0}変更Credits * {0}して再実行し、除数として「10」と入力します)。

コードで定義したクエリの実行の詳細については、「 方法: データ ソースに対してコマンドを直接実行する」を参照してください。

Model-First開発

これらのチュートリアルでは、最初にデータベースを作成し、データベース構造に基づいてデータ モデルを生成しました。 Entity Framework 4 では、代わりにデータ モデルから開始し、データ モデル構造に基づいてデータベースを生成できます。 データベースがまだ存在しないアプリケーションを作成する場合、モデル優先のアプローチでは、物理的な実装の詳細を気にすることなく、アプリケーションの概念的に意味のあるエンティティとリレーションシップを作成できます。 (これは、開発の初期段階でのみ当てはまります。最終的にデータベースが作成され、運用データが含まれるようになり、モデルから再作成することは実用的ではなくなります。その時点で、データベース優先のアプローチに戻ります)。

チュートリアルのこのセクションでは、単純なデータ モデルを作成し、そこからデータベースを生成します。

ソリューション エクスプローラーDAL フォルダーを右クリックし、[新しい項目の追加] を選択します。 [ 新しい項目の追加 ] ダイアログ ボックスの [ インストールされているテンプレート ] で [ データ ] を選択し、 ADO.NET エンティティ データ モデル テンプレートを選択します。 新しいファイルに AlumniAssociationModel.edmx という名前を 付け、[追加] をクリックします。

Image06

これにより、エンティティ データ モデル ウィザードが起動します。 [ モデル コンテンツの選択] ステップで、[ 空のモデル ] を選択し、[完了] をクリック します

Image07

[Entity Data Model]\(エンティティ データ モデル\) Designerが開き、空のデザイン 画面が表示されます。 [ツールボックス] から [エンティティ] 項目をデザインサーフェイスにドラッグします。

Image08

エンティティ名を から Entity1Alumnus変更し、プロパティ名を IdAlumnusId変更し、 という名前 Nameの新しいスカラー プロパティを追加します。 新しいプロパティを追加するには、列の名前を変更した後に Enter キーを Id 押すか、エンティティを右クリックして [ スカラー プロパティの追加] を選択します。 新しいプロパティの既定の型は です String。この簡単なデモでは問題ありませんが、もちろん、[ プロパティ ] ウィンドウでデータ型などを変更できます。

同じ方法で別のエンティティを作成し、 という名前を付けます Donation。 プロパティを にIdDonationId変更し、 という名前DateAndAmountのスカラー プロパティを追加します。

Image09

これら 2 つのエンティティ間に関連付けを追加するには、エンティティを Alumnus 右クリックし、[ 追加] を選択し、[ 関連付け] を選択します。

Image10

[ 関連付けの追加 ] ダイアログ ボックスの既定値は、目的の値 (一対多、ナビゲーション プロパティを含める、外部キーを含める) であるため、[OK] をクリック するだけです

Image11

デザイナーは、関連付け行と外部キー プロパティを追加します。

Image12

これで、データベースを作成する準備ができました。 デザイン画面を右クリックし、[ モデルからデータベースを生成] を選択します。

Image13

これにより、データベースの生成ウィザードが起動します。 (エンティティがマップされていないことを示す警告が表示された場合は、当面は無視できます)。

[ データ接続の選択] ステップで 、[ 新しい接続] をクリックします。

Image14

[接続のプロパティ] ダイアログ ボックスで、ローカル SQL Server Express インスタンスを選択し、データベースに という名前を付けますAlumniAssociation

Image15

データベースを作成するかどうかを確認するメッセージが表示されたら、[ はい ] をクリックします。 [ データ接続の選択] ステップが再び表示されたら、[ 次へ] をクリックします。

[ 概要と設定] ステップで 、[ 完了] をクリックします。

Image18

データ定義言語 (DDL) コマンドを含む .sql ファイルが作成されますが、コマンドはまだ実行されていません。

Image20

SQL Server Management Studio などのツールを使用してスクリプトを実行し、テーブルを作成します。これは、はじめに チュートリアル シリーズの最初のチュートリアルのデータベースを作成Schoolしたときに行った場合と同様です。 (データベースをダウンロードした場合を除く)。

これで、モデルを使用する AlumniAssociation のと同じ方法で、Web ページでデータ モデルを School 使用できるようになりました。 これを試すには、テーブルにいくつかのデータを追加し、データを表示する Web ページを作成します。

サーバー エクスプローラーを使用して、 テーブルと Donation テーブルに次の行をAlumnus追加します。

Image21

Site.Master マスター ページを使用する Alumni.aspx という名前の新しい Web ページを作成します。 という名前Content2のコントロールに次のマークアップをContent追加します。

<h2>Alumni</h2>
    <asp:EntityDataSource ID="AlumniEntityDataSource" runat="server" 
        ContextTypeName="ContosoUniversity.DAL.AlumniAssociationModelContainer" EnableFlattening="False" 
        EntitySetName="Alumni">
    </asp:EntityDataSource>
    <asp:GridView ID="AlumniGridView" runat="server" 
        DataSourceID="AlumniEntityDataSource" AutoGenerateColumns="False"
        OnRowDataBound="AlumniGridView_RowDataBound"
        DataKeyNames="AlumnusId">
        <Columns>
            <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
            <asp:TemplateField HeaderText="Donations">
                <ItemTemplate>
                    <asp:GridView ID="DonationsGridView" runat="server" AutoGenerateColumns="False">
                        <Columns>
                            <asp:BoundField DataField="DateAndAmount" HeaderText="Date and Amount" />
                        </Columns>
                    </asp:GridView>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>

このマークアップでは、入れ子になった GridView コントロール、同窓生の名前を表示する外側のコントロール、および寄付の日付と金額を表示する内部コントロールが作成されます。

Alumni.aspx.cs を開きますusingデータ アクセス層のステートメントと、外部GridViewコントロールRowDataBoundのイベントのハンドラーを追加します。

using ContosoUniversity.DAL; 

// ...

protected void AlumniGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        var alumnus = e.Row.DataItem as Alumnus;
        var donationsGridView = (GridView)e.Row.FindControl("DonationsGridView");
        donationsGridView.DataSource = alumnus.Donations.ToList();
        donationsGridView.DataBind();
    }
}

このコードは、現在の行Alumnusのエンティティのナビゲーション プロパティをDonations使用して、内部GridViewコントロールをデータバインドします。

ページを実行します。

Image22

(注: このページはダウンロード可能なプロジェクトに含まれていますが、機能させるには、ローカル SQL Server Express インスタンスにデータベースを作成する必要があります。データベースは、App_Data フォルダーに .mdf ファイルとして含まれていません)。

Entity Framework のモデル優先機能の使用の詳細については、「Entity Framework 4 の Model-First」を参照してください。

POCO サポート

ドメイン駆動型の設計手法を使用する場合は、ビジネス ドメインに関連するデータと動作を表すデータ クラスを設計します。 これらのクラスは、データの格納 (永続化) に使用される特定のテクノロジとは無関係である必要があります。つまり、永続化は 無視する必要があります。 永続化を無視すると、単体テスト プロジェクトでテストに最も便利な永続化テクノロジを使用できるため、クラスを単体テストしやすくなります。 以前のバージョンの Entity Framework では、エンティティ クラスが クラスから EntityObject 継承する必要があり、Entity Framework 固有の機能が多く含まれていたため、永続化の無視に対するサポートは限定的でした。

Entity Framework 4 では、 クラスから EntityObject 継承されないエンティティ クラスを使用する機能が導入されているため、永続化は無視されます。 Entity Framework のコンテキストでは、このようなクラスは通常、 プレーン古い CLR オブジェクト (POCO、または POCO) と呼ばれます。 POCO クラスは手動で記述することも、Entity Framework によって提供されるテキスト テンプレート変換ツールキット (T4) テンプレートを使用して、既存のデータ モデルに基づいて自動的に生成することもできます。

Entity Framework での POCO の使用の詳細については、次のリソースを参照してください。

Code-First開発

Entity Framework 4 での POCO サポートでは、データ モデルを作成し、エンティティ クラスをデータ モデルにリンクする必要があります。 Entity Framework の次のリリースには、 コードファースト開発と呼ばれる機能が含まれます。 この機能を使用すると、データ モデル デザイナーまたはデータ モデル XML ファイルを使用しなくても、独自の POCO クラスで Entity Framework を使用できます。 (したがって、このオプションは コード専用とも呼ばれています。 code-firstcode-only はどちらも同じ Entity Framework 機能を参照します)。

開発に対するコード優先アプローチの使用方法の詳細については、次のリソースを参照してください。

さらに、Contoso University アプリケーションと同様のアプリケーションを構築する新しい MVC Code-First チュートリアルは、2011 年春に公開される予定です。 https://asp.net/entity-framework/tutorials

詳細情報

これで、Entity Framework の新機能の概要と、Entity Framework チュートリアル シリーズの継続について説明します。 ここでは説明していない Entity Framework 4 の新機能の詳細については、次のリソースを参照してください。