Entity Framework でモデル クラスを作成する (VB)

作成者: Microsoft

このチュートリアルでは、Microsoft Entity Framework で ASP.NET MVC を使用する方法について説明します。 エンティティ ウィザードを使用して、ADO.NET エンティティ データ モデルを作成する方法について説明します。 このチュートリアルでは、Entity Framework を使用してデータベース データを選択、挿入、更新、削除する方法を示す Web アプリケーションを構築します。

このチュートリアルの目的は、ASP.NET MVC アプリケーションをビルドするときに Microsoft Entity Framework を使用してデータ アクセス クラスを作成する方法について説明することです。 このチュートリアルでは、Microsoft Entity Framework に関する以前の知識がないことを前提としています。 このチュートリアルの終わりまでに、Entity Framework を使用してデータベース レコードを選択、挿入、更新、削除する方法について説明します。

Microsoft Entity Framework は、データベースからデータ アクセス層を自動的に生成できるオブジェクト リレーショナル マッピング (O/RM) ツールです。 Entity Framework を使用すると、手動でデータ アクセス クラスを構築する面倒な作業を回避できます。

Note

ASP.NET MVC と Microsoft Entity Framework の間に重要な接続はありません。 Entity Framework には、ASP.NET MVC で使用できるいくつかの代替手段があります。 たとえば、Microsoft LINQ to SQL、NHibernate、SubSonic などの他の O/RM ツールを使用して MVC モデル クラスを構築できます。

ASP.NET MVC で Microsoft Entity Framework を使用する方法を説明するために、簡単なサンプル アプリケーションを構築します。 ムービー データベース レコードを表示および編集できる Movie Database アプリケーションを作成します。

このチュートリアルでは、Visual Studio 2008 または Visual Web Developer 2008 Service Pack 1 があることを前提としています。 Entity Framework を使用するには、Service Pack 1 が必要です。 次のアドレスから、Visual Studio 2008 Service Pack 1 または Visual Web Developer with Service Pack 1 をダウンロードできます。

https://www.asp.net/downloads/

ムービー サンプル データベースの作成

Movie Database アプリケーションは、次の列を含む Movies という名前のデータベース テーブルを使用します。

列名 データ型 Null を許可しますか? 主キーですか?
Id INT False True
タイトル nvarchar(100) False False
ディレクター nvarchar(100) False False

次の手順に従って、このテーブルを ASP.NET MVC プロジェクトに追加できます。

  1. ソリューション エクスプローラー ウィンドウでApp_Data フォルダーを右クリックし、メニュー オプション [追加]、[新しい項目] の順に選択します。
  2. [新しい項目の追加] ダイアログ ボックスで、[データベースSQL Server選択し、データベースに MoviesDB.mdf という名前を付けて、[追加] ボタンをクリックします。
  3. MoviesDB.mdf ファイルをダブルクリックして、サーバー エクスプローラー/データベース エクスプローラー ウィンドウを開きます。
  4. MoviesDB.mdf データベース接続を展開し、[テーブル] フォルダーを右クリックし、メニュー オプション [ 新しいテーブルの追加] を選択します。
  5. [テーブル] Designerで、[ID]、[タイトル]、[ディレクター] の各列を追加します。
  6. [ 保存 ] ボタン (フロッピーのアイコンが表示されます) をクリックして、新しいテーブルを Movies という名前で保存します。

Movies データベース テーブルを作成したら、いくつかのサンプル データをテーブルに追加する必要があります。 Movies テーブルを右クリックし、メニュー オプション [ テーブル データの表示] を選択します。 表示されるグリッドに偽のムービー データを入力できます。

ADO.NET エンティティ データ モデルの作成

Entity Framework を使用するには、エンティティ データ モデルを作成する必要があります。 Visual Studio エンティティ データ モデル ウィザード を利用して、データベースからエンティティ データ モデルを自動的に生成できます。

次の手順のようにします。

  1. ソリューション エクスプローラー ウィンドウで Models フォルダーを右クリックし、メニュー オプション [追加]、[新しい項目] を選択します。
  2. [ 新しい項目の追加 ] ダイアログで、[データ] カテゴリを選択します (図 1 を参照)。
  3. [ADO.NET エンティティ データ モデル] テンプレートを選択し、[エンティティ データ モデル] に MoviesDBModel.edmx という名前を付けて、[追加] ボタンをクリックします。 [ 追加 ] ボタンをクリックすると、データ モデル ウィザードが起動します。
  4. [ モデル コンテンツの選択 ] ステップで、[ データベースから生成 ] オプションを選択し、[ 次へ ] ボタンをクリックします (図 2 を参照)。
  5. [ データ接続の選択 ] ステップで、MoviesDB.mdf データベース接続を選択し、MoviesDBEntities というエンティティ接続設定名を入力して、[ 次へ ] ボタンをクリックします (図 3 を参照)。
  6. [ データベース オブジェクトの選択 ] ステップで、Movie データベース テーブルを選択し、[ 完了 ] ボタンをクリックします (図 4 を参照)。

これらの手順を完了すると、ADO.NET エンティティ データ モデル Designer (エンティティ Designer) が開きます。

図 1 – 新しいエンティティ データ モデルの作成

clip_image002

図 2 – モデル コンテンツの選択ステップ

clip_image004

図 3 – データ接続を選択する

clip_image006

図 4 – データベース オブジェクトを選択する

clip_image008

ADO.NET エンティティ データ モデルの変更

エンティティ データ モデルを作成したら、Entity Designerを利用してモデルを変更できます (図 5 を参照)。 ソリューション エクスプローラー ウィンドウ内の Models フォルダーに含まれる MoviesDBModel.edmx ファイルをダブルクリックすると、いつでも Entity Designerを開くことができます。

図 5 – ADO.NET エンティティ データ モデルのDesigner

clip_image010

たとえば、エンティティ Designerを使用して、エンティティ モデル データ ウィザードで生成されるクラスの名前を変更できます。 ウィザードによって Movies という名前の新しいデータ アクセス クラスが作成されました。 言い換えると、ウィザードはクラスにデータベース テーブルとまったく同じ名前を付けます。 このクラスを使用して特定の Movie インスタンスを表すので、クラスの名前を Movies から Movie に変更する必要があります。

エンティティ クラスの名前を変更する場合は、[エンティティ] Designerでクラス名をダブルクリックし、新しい名前を入力します (図 6 を参照)。 または、エンティティ Designerでエンティティを選択した後、プロパティ ウィンドウ内のエンティティの名前を変更することもできます。

図 6 – エンティティ名の変更

clip_image012

[保存] ボタン (フロッピー ディスクのアイコン) をクリックして変更を加えた後は、必ずエンティティ データ モデルを保存してください。 エンティティ Designerは、バックグラウンドで一連の Visual Basic .NET クラスを生成します。 これらのクラスを表示するには、MoviesDBModel を開きます。ソリューション エクスプローラー ウィンドウから Designer.vb ファイル。

次に Entity Designerを使用すると変更が上書きされるため、Designer.vb ファイル内のコードは変更しないでください。 Designer.vb ファイルで定義されているエンティティ クラスの機能を拡張する場合は、別のファイルに部分クラスを作成できます。

Entity Framework を使用したデータベース レコードの選択

ムービー レコードの一覧を表示するページを作成して、Movie Database アプリケーションの構築を開始しましょう。 リスト 1 のホーム コントローラーは、Index() という名前のアクションを公開します。 Index() アクションは、Entity Framework を利用して Movie データベース テーブルからすべてのムービー レコードを返します。

リスト 1 – Controllers\HomeController.vb

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Private _db As MoviesDBEntities

    Public Sub New()
        _db = New MoviesDBEntities()
    End Sub

    Public Function Index()
        ViewData.Model = _db.MovieSet.ToList()
        Return View()
    End Function

End Class

リスト 1 のコントローラーにコンストラクターが含まれていることに注意してください。 コンストラクターは、_db という名前のクラス レベルのフィールドを初期化します。 _db フィールドは、Microsoft Entity Framework によって生成されたデータベース エンティティを表します。 _db フィールドは、Entity Designerによって生成された MoviesDBEntities クラスのインスタンスです。

_db フィールドは、Movies データベース テーブルからレコードを取得するために Index() アクション内で使用されます。 式_db。MovieSet は、Movies データベース テーブルのすべてのレコードを表します。 ToList() メソッドは、ムービーのセットを Movie オブジェクトの汎用コレクション List( Of Movie) に変換するために使用されます。

ムービー レコードは、LINQ to Entitiesの助けを借りて取得されます。 リスト 1 の Index() アクションでは、LINQ メソッド構文 を使用してデータベース レコードのセットを取得します。 必要に応じて、代わりに LINQ クエリ構文 を使用できます。 次の 2 つのステートメントは、まったく同じことを行います。

ViewData.Model = _db.MovieSet.ToList()
ViewData.Model = (from m in _db.MovieSet select m).ToList()

最も直感的な LINQ 構文 (メソッド構文またはクエリ構文) を使用します。 2 つのアプローチのパフォーマンスに違いはありません。唯一の違いはスタイルです。

リスト 2 のビューは、ムービー レコードを表示するために使用されます。

リスト 2 – Views\Home\Index.aspx

<%@ Page Language="VB" 
  Inherits="System.Web.Mvc.ViewPage(Of List(Of MvcApplication1.Movie))" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Index</title>
</head>
<body>
    <div>
    
<%  For Each m In Model%>

    Title: <%= m.Title %>
    <br />
    Director: <%= m.Director %>
    <br />
    <%=Html.ActionLink("Edit", "Edit", New With {.id = m.Id})%>
    <%=Html.ActionLink("Delete", "Delete", New With {.id = m.Id})%>
       
        <hr />
<% Next%>
    
    <%= Html.ActionLink("Add Movie", "Add") %>
    
    </div>
</body>
</html>

リスト 2 のビューには、各ムービー レコードを反復処理し、ムービー レコードの Title プロパティと Director プロパティの値を表示する For Each ループが含まれています。 各レコードの横に [編集] リンクと [削除] リンクが表示されていることに注意してください。 さらに、ビューの下部に [ムービーの追加] リンクが表示されます (図 7 を参照)。

図 7 – インデックス ビュー

clip_image014

インデックス ビューは 型指定されたビューです。 インデックス ビューには、Inherits 属性を <含む %@ Page %> ディレクティブがあります。 Inherits 属性は、ViewData.Model プロパティを Movie オブジェクトの厳密に型指定された汎用 List コレクション (List(Of Movie) にキャストします。

Entity Framework を使用したデータベース レコードの挿入

Entity Framework を使用すると、データベース テーブルに新しいレコードを簡単に挿入できます。 リスト 3 には、Movie データベース テーブルに新しいレコードを挿入するために使用できる、ホーム コントローラー クラスに追加された 2 つの新しいアクションが含まれています。

リスト 3 – Controllers\HomeController.vb (Add メソッド)

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Public Function Add()
        Return View()
    End Function

    <AcceptVerbs(HttpVerbs.Post)> _
    Public Function Add(ByVal form As FormCollection)
        Dim movieToAdd As New Movie()

        ' Deserialize (Include white list!)
        TryUpdateModel(movieToAdd, New String() {"Title", "Director"}, form.ToValueProvider())

        ' Validate
        If String.IsNullOrEmpty(movieToAdd.Title) Then
            ModelState.AddModelError("Title", "Title is required!")
        End If
        If String.IsNullOrEmpty(movieToAdd.Director) Then
            ModelState.AddModelError("Director", "Director is required!")
        End If

        ' If valid, save movie to database
        If (ModelState.IsValid) Then
            _db.AddToMovieSet(movieToAdd)
            _db.SaveChanges()
            Return RedirectToAction("Index")
        End If

        ' Otherwise, reshow form
        Return View(movieToAdd)
    End Function

End Class

最初の Add() アクションは、単にビューを返します。 ビューには、新しいムービー データベース レコードを追加するためのフォームが含まれています (図 8 を参照)。 フォームを送信すると、2 番目の Add() アクションが呼び出されます。

2 番目の Add() アクションは AcceptVerbs 属性で装飾されていることに注意してください。 このアクションは、HTTP POST 操作を実行する場合にのみ呼び出すことができます。 つまり、このアクションは HTML フォームを投稿するときにのみ呼び出すことができます。

2 番目の Add() アクションは、ASP.NET MVC TryUpdateModel() メソッドを使用して Entity Framework Movie クラスの新しいインスタンスを作成します。 TryUpdateModel() メソッドは、Add() メソッドに渡された FormCollection のフィールドを取得し、これらの HTML フォーム フィールドの値を Movie クラスに割り当てます。

Entity Framework を使用する場合は、TryUpdateModel メソッドまたは UpdateModel メソッドを使用してエンティティ クラスのプロパティを更新するときに、プロパティの "セーフリスト" を指定する必要があります。

次に、Add() アクションによって、いくつかの単純なフォーム検証が実行されます。 アクションは、Title プロパティと Director プロパティの両方に値があることを確認します。 検証エラーがある場合は、検証エラー メッセージが ModelState に追加されます。

検証エラーがない場合は、Entity Framework を使用して新しいムービー レコードが Movies データベース テーブルに追加されます。 新しいレコードは、次の 2 行のコードでデータベースに追加されます。

_db.AddToMovieSet(movieToAdd)
_db.SaveChanges()

コードの最初の行は、Entity Framework によって追跡されているムービーのセットに新しい Movie エンティティを追加します。 2 行目のコードは、基になるデータベースに追跡される Movies に対して行われた変更を保存します。

図 8 – [追加] ビュー

clip_image016

Entity Framework を使用したデータベース レコードの更新

Entity Framework を使用してデータベース レコードを編集するのとほぼ同じ方法に従って、新しいデータベース レコードを挿入する方法と同じ方法を使用できます。 リスト 4 には、Edit() という名前の 2 つの新しいコントローラー アクションが含まれています。 最初の Edit() アクションは、ムービー レコードを編集するための HTML フォームを返します。 2 番目の Edit() アクションは、データベースの更新を試みます。

リスト 4 – Controllers\HomeController.vb (Edit メソッド)

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Public Function Edit(ByVal id As Integer)
        ' Get movie to update
        Dim movieToUpdate As Movie = _db.MovieSet.First(Function(m) m.Id = id)
        ViewData.Model = movieToUpdate
        Return View()
    End Function

    <AcceptVerbs(HttpVerbs.Post)> _
    Public Function Edit(ByVal form As FormCollection)

        ' Get movie to update
        Dim id As Integer = Integer.Parse(form("id"))
        Dim movieToUpdate As Movie = _db.MovieSet.First(Function(m) m.Id = id)

        ' Deserialize (Include white list!)
        TryUpdateModel(movieToUpdate, New String() {"Title", "Director"}, form.ToValueProvider)

        ' Validate
        If String.IsNullOrEmpty(movieToUpdate.Title) Then
            ModelState.AddModelError("Title", "Title is required!")
        End If
        If String.IsNullOrEmpty(movieToUpdate.Director) Then
            ModelState.AddModelError("Director", "Director is required!")
        End If

        ' If valid, save movie to database
        If (ModelState.IsValid) Then
            _db.SaveChanges()
            Return RedirectToAction("Index")
        End If

        ' Otherwise, reshow form
        Return View(movieToUpdate)
    End Function

End Class

2 番目の Edit() アクションは、まず、編集中のムービーの ID と一致する Movie レコードをデータベースから取得します。 次のLINQ to Entities ステートメントは、特定の ID に一致する最初のデータベース レコードを取得します。

Dim movieToUpdate As Movie = _db.MovieSet.First(Function(m) m.Id = id)

次に、TryUpdateModel() メソッドを使用して、HTML フォーム フィールドの値をムービー エンティティのプロパティに割り当てます。 更新する正確なプロパティを指定するためにセーフリストが指定されていることに注意してください。

次に、Movie Title プロパティと Director プロパティの両方に値があることを確認するために、いくつかの簡単な検証が実行されます。 いずれかのプロパティに値がない場合は、検証エラー メッセージが ModelState に追加され、ModelState.IsValid は値 false を返します。

最後に、検証エラーがない場合は、SaveChanges() メソッドを呼び出すことによって、基になる Movies データベース テーブルが変更で更新されます。

データベース レコードを編集するときは、編集中のレコードの ID を、データベース更新を実行するコントローラー アクションに渡す必要があります。 それ以外の場合、コントローラー アクションは、基になるデータベースで更新するレコードを認識しません。 リスト 5 に含まれる編集ビューには、編集するデータベース レコードの ID を表す非表示のフォーム フィールドが含まれています。

リスト 5 – Views\Home\Edit.aspx

<%@ Page Language="VB" Inherits="System.Web.Mvc.ViewPage(Of MvcApplication1.Movie)" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>Edit</title>
    <style type="text/css">
    
    .input-validation-error
    {
        background-color:Yellow;
    }
    
    </style>    
</head>
<body>
    <div>

<h1>Edit Movie</h1>

<form method="post" action="/Home/Edit">

    <!-- Include Hidden Id -->
    <%= Html.Hidden("id") %>

    Title:
    <br />
    <%= Html.TextBox("title") %>
    
    <br /><br />
    Director:
    <br />
    <%= Html.TextBox("director") %>
    
    <br /><br />
    <input type="submit" value="Edit Movie" />
</form>
    
    </div>
</body>
</html>

Entity Framework を使用したデータベース レコードの削除

このチュートリアルで取り組む必要がある最後のデータベース操作は、データベース レコードを削除することです。 リスト 6 のコントローラー アクションを使用して、特定のデータベース レコードを削除できます。

リスト 6 -- \Controllers\HomeController.vb (削除アクション)

<HandleError()> _
Public Class HomeController
    Inherits System.Web.Mvc.Controller

    Public Function Delete(ByVal id As Integer)
        ' Get movie to delete
        Dim movieToDelete As Movie = _db.MovieSet.First(Function(m) m.Id = id)

        ' Delete 
        _db.DeleteObject(movieToDelete)
        _db.SaveChanges()

        ' Show Index view
        Return RedirectToAction("Index")
    End Function

End Class

Delete() アクションは、最初にアクションに渡された ID と一致する Movie エンティティを取得します。 次に、DeleteObject() メソッドの後に SaveChanges() メソッドを呼び出して、データベースからムービーを削除します。 最後に、ユーザーはインデックス ビューにリダイレクトされます。

まとめ

このチュートリアルの目的は、ASP.NET MVC と Microsoft Entity Framework を利用してデータベース駆動型 Web アプリケーションを構築する方法を示すことでした。 データベース レコードを選択、挿入、更新、削除できるアプリケーションを構築する方法について学習しました。

まず、エンティティ データ モデル ウィザードを使用して、Visual Studio 内からエンティティ データ モデルを生成する方法について説明しました。 次に、LINQ to Entitiesを使用してデータベース テーブルから一連のデータベース レコードを取得する方法について説明します。 最後に、Entity Framework を使用して、データベース レコードの挿入、更新、削除を行いました。