マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。

目次

概要

.NET Framework 3.5 SP1で追加されたデータベースアクセステクノロジー

  • Entity Frameworkは、TableAdapter と比べ、より高次の機能を提供し、高い生産性を誇る RAD ツールです。
  • データアクセス部分を隠ぺいするため、データベースの種類や構造を意識することなくプログラミングできます。
  • 反面、実際に発行される SQL 文の構築は Entity Framework に委ねられます。
  • このため、チューニングや、柔軟なデータの参照・更新が課題になりやすく、
    ミッション クリティカルなエンタープライズ システム開発には適合しないことがあります。

概念モデルに対してプログラミング

Entity Frameworkは、インピーダンス・ミスマッチ問題を解決するため、
エンティティを定義し、エンティティ経由でデータベースへアクセスするための手段を提供する技術。

  • 概念モデルであるEntity Data Model(EDM)を開発者が柔軟にモデリング可能。
    RDBに対して直接プログラミングする代わりに、EDMに対してプログラミングする。
  • これにより、テーブルとオブジェクトを1対1に対応させるO/Rマッパとは異なり、
    「結合(Join)」というRDB固有の事情に振り回されることなく、
    より直感的に必要な情報を取得することが可能になる。
  • RDB側のスキーマ変更(特にテーブルの分割/統合のような変化)に対して耐性がある。
  • EntityはADO.NET 非接続型と同様に、多階層のアプリケーションを開発する場合、
    オブジェクトとして渡すことが可能でありDTO(Data Transfer Object)として利用できる。

Entity Data Model(EDM)

CSDL、SSDL、および MSL 仕様
http://msdn.microsoft.com/ja-jp/library/vstudio/bb399604.aspx

  • 概念スキーマ定義言語 (CSDL) <---> マッピング仕様言語 (MSL) <---> ストア スキーマ定義言語 (SSDL) は
    XML ベースの言語で、それぞれ概念モデル、モデル間のマッピング、ストレージ モデルについて記述する。
  • Entity Data Model(EDM) の定義は、Entity Data Model デザイナーにより、
    設計時にモデルとマッピングの情報を *.edmx ファイルに保存する。
  • Entity Data Model デザイナーは、ビルド時に EDMファイル(*.edmx)の情報を使用して、
    Entity Framework が実行時に必要とする *.csdl、*.ssdl、および *.mslファイルを作成する。

CSDL

CSDL(Conceptual Schema Definition Language:概念スキーマ定義言語)
概念スキーマ(概念モデル)

MSL

MSL(Mapping Schema Language:マッピング・スキーマ言語)
CSDLとSSDL(モデル間)のマッピング

SSDL

SSDL(Storage Schema Definition Language:ストア・スキーマ定義言語)
ストレージ・スキーマ(ストレージ モデル)

xxx ファースト

  • エンタープライズではほぼ、DBファーストを採用する。
  • 単純なテーブル(データストア)しか使用しない
    EUCなどの世界では、モデルファーストもマッチする可能性がある。

モデルファースト

モデル(EDM)からDBMSのスキーマを生成する方法

DBファースト

DBMSのスキーマからモデル(EDM)を生成する方法

コードファースト

  • ADO.NET Entity Framework 4.1 で登場した機能。
  • Entityへのデータ構造の定義が、そのままデータベースのテーブル設計となる。
    • ASP.NET MVC のModel(Entity)でデータ構造を定義すると、
      その定義に従ってデータベースにテーブルが作成される。
    • ソースコードのみで完結し、
      Entity Framework のEntity Data Model (EDM) などを
      明示的に作成する必要がなくなるため、より迅速な開発が可能となる。

CRUD処理

ここでは、「context」がDbContext?を継承したコンテキストを指している。
サンプルプログラム次第で、context, db, dbContextなどの名称が使用される。

仕組み

Entity States

Entityは以下のEntity Statesを持っており、

  • Unchanged状態
    追跡開始後に変更されていない状態
  • Added状態
    追加された状態。
  • Modified状態
    編集された状態。
  • Deleted状態
    削除された状態。
  • Detached状態
    追跡が開始されていない状態

SaveChanges?()メソッド

SaveChanges?()メソッドを呼び出した際に、
コレを更新系SQLに変えて実行すると言う、ある種、
RowState? + TableAdapter的な仕組みで動作している。

参照系

LINQは遅延評価

LINQは遅延評価なので、結果が必要になるまではSql文が発行されない。

ToArray()メソッドや、Load()メソッドを使うと、
即時実行されて結果をメモリに起こす事ができる。

オブジェクト参照

オブジェクト参照によりSQLが実行される。

using (var context = new XXXXXContext())
{
    foreach (var YYYYY in context.YYYYYs)
    {
        Console.WriteLine(YYYYY.Name);
    }
}

単一要素取得のLINQメソッド

  • Find()メソッド
    • 主キーを使用して検索する。
      • DbContext?にキャッシュがあれば、それを検索する。
      • キャッシュがない or キャッシュ内にデータが無い場合、SQLで検索する。
  • Single()メソッド
    • 0件、複数件の結果が返ったらエラーを返す。
    • DBMSのTOPヒントなどを使用する(Select Top 2 * From YYYYYs)ので性能はいい。
      context.YYYYYs.Single(x => x.name == "hogehoge");
  • SingleOrDefault?()メソッド
    • 取得した結果が0件の場合、既定値を返す。1件の場合、その要素を返す。
    • 取得した結果が0件 or 1件以外の結果が返ったらエラーを返す。
    • DBMSのTOPヒントなどを使用する(Select Top 2 * From YYYYYs)ので性能はいい。
      context.YYYYYs.Single(x => x.name == "hogehoge");
  • ,etc.

LINQ to Object

以下の様な感じ。

  • ToArray()メソッドで確定させた結果に対してLINQを実行する。
    var YYYYYs = context.YYYYYs.ToArray();
    YYYYYs.Where(x => x.Name == "hogehoge")
  • Load()メソッドでキャッシュした後に、
    Localプロパティに対してLINQを実行する。
    context.YYYYYs.Load()
    context.YYYYYs.Local.OrderBy(x => x.Name);

詳しくは、LINQ to Objectを参照。

LINQ to Entities

以下の様な感じ。

context.YYYYYs.Where(x => x.Id == "1");
context.YYYYYs.Where(x => x.Name == "hogehoge").ToArray();

注意

全体的に実行されるSQLがブラックボックスで性能を意識し難い。

更新系

Insert

using (var context = new XXXXXContext())
{
    // YYYYY Entity の Statesが
    // Unchanged状態→Added状態へ。
    context.YYYYYs.Add(new YYYYY
    {
        プロパティ名1 = 値1,
        プロパティ名2 = 値2,
    });

    // SaveChanges→Added状態の
    // YYYYY EntityがInsert文に替えられる。
    context.SaveChanges();
}

Update

using (var context = new XXXXXContext())
{
    var yyyyy = context.YYYYYs.Single(x => x.Name == "hogehoge");
    yyyyy.Name = "Aiueo";
    context.SaveChanges();
}

Delete

  • Select ---> Delete
    using (var context = new XXXXXContext())
    {
        var yyyyy = context.YYYYYs.Single(x => x.Name == "hogehoge");
        context.YYYYYs.Remove(yyyyy);
        context.SaveChanges();
    }
  • 直接 Delete
    using (var context = new XXXXXContext())
    {
        var toRemoveYyyyy = new YYYYY { Id = 1 };
        context.YYYYYs.Attach(toRemoveYyyyy);
        context.YYYYYs.Remove(toRemoveYyyyy);
        context.SaveChanges();
    }

参考

Entity Framework の懸念

Entity Framework の調査

LINQ to Entities

  • LINQとの関連もチェックして下さい。

LINQ to Entities, QueryBuilder?, Entity SQL

Entity Framework Core

@IT

  • 連載:ADO.NET Entity Framework入門 - @IT
    http://www.atmarkit.co.jp/fdotnet/ef4basic/index/index.html
    • 第1回 最新DBアクセス・フレームワークの基本的な考え方
    • 第2回 EDMにおける多対多関係とEntity Frameworkでのデータの取得/保存
    • 第3回 Entity Frameworkにおけるクエリと更新
    • 第4回 データベースからのEntity Data Model生成
    • 第5回 POCOによるエンティティ・クラス
    • 第6回 EF4によるN層アーキテクチャと自己追跡エンティティ【前編】
    • 第7回 EF4によるN層アーキテクチャと自己追跡エンティティ【後編】

Microsoft Docs

MSDN

magazine

blogs

  • 雲のごとく - Site Home - MSDN Blogs

Tags: :.NET開発, :データアクセス, :ADO.NET, :Entity Framework


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-07-31 (火) 09:07:16 (51d)