読者です 読者をやめる 読者になる 読者になる

Entity Framework の歴史を振り返る

仕事じゃ SQL Server は使ってないし、家だと RDBMS 環境の構築/メンテが面倒で(せいぜい使うとしたら NoSQL)、これまで Entity Framework にはあまり深入りしていなかったのですが、今日ちょっと使いたいなと思って調べたらバージョンが 5 まで上がっててびっくりしました。しかも EF 6 もアルファ 3 まで来ているんですね。

少し前にちょいちょい触ってたり、当時作ってたアプリに導入を検討してたのがバージョン 4 だったのですが、結構頻繁にアップデートしているんですねー。全く追えてなくて恥ずかしい限りです。

良い機会なので、概念や機能の理解と併せて Entity Framework の歴史を整理してみます。間違っていることもあると思いますので、気付いたらご指摘頂けるととても喜びます。

そもそも Entity Framework とは

最近は頻繁に Web 上で日本語の情報を見かけるようになったので、今更かも知れませんが。

ちなみに @IT のこちらの記事がとても参考になります。Entity Framework 4 or 4.1 なら↑のサイトで概念から入門までほとんど網羅されているのではないでしょうか。正直これ以上このエントリ読むよりよっぽど為になるので、まだ読んでない方は今すぐ読みましょう。 http://www.atmarkit.co.jp/fdotnet/ef4basic/ef4basic01/ef4basic01_01.html

さて、簡単に整理すると、Entity Framework とは、 Entity Data Model(以下 EDM) = 概念モデル(ドメインモデル)を使ってモデルファーストなプログラミングをサポートすることを目的としたフレームワークです。

ADO.NET という、昔から存在する .NET 環境でデータアクセスを行えるようにするためフレームワーク(ちなみに .NET Framework の一部です)の上に、さらに被せる形で構築されています。なお、最新版では、.NET Framework に依存してはいるものの独立したフレームワーク、という立ち位置になります。

今までの開発では、RDB 特有のリレーショナルモデルとオブジェクト指向モデルとの両軸から設計を行っていました。理想的には固有の技術に依存しない、ドメインモデリングの結果からの DB 設計、クラス設計を行っていくべきだろうと思うのですが、(私の知る範囲の)現実にはそれぞれがそれぞれで設計を行うか、どちらかに偏ってしまいがちな問題がありました。

仮に、理想的な設計プロセスを経ることが出来たとしても、やはりリレーショナルモデルとオブジェクト指向モデルは異なる思想を持った概念ですので、それらを一気貫通にアプリケーションで扱おうとすると、どうしても概念の変換コストが掛かることからは逃れられません。

ここで言っている思想の違いはインピーダンスミスマッチと呼ばれています。そして、本来我々が解決したい課題では無いにも関わらず、そこに多大な変換コストを払わなければいけない、というこの状況を改善することが Entity Framework のゴールだと私は理解しています。

あと、↑の参考サイトには書いていない個人の感想ですが、それぞれの設計において求められるスキルも異なるというのも結構な負荷に感じていました。

専門の DBA がいるような会社であれば良いのですが、私のいるような中小企業においては、なかなかそんなスペシャリストには出会えません(それでもアプリケーション側のスペシャリストはたまに出会えます)。となると、自然、両方のスキルを求められることになる訳ですね。まぁそれはそれで色々学べて面白いと言えば面白いのですが、大変だなぁというのも正直な気持ちです。

Entity Framework の歴史

ちょっと前置きが長くなってしまいましたが、ここから本題の Entity Framework の歴史についてです。

Entity Framework 1

Entity Framework 1 は、.Net Framework 3.5 SP 1 に付属する形でリリースされました。 http://en.wikipedia.org/wiki/Entity_Framework

主な特徴は

  • 専用デザイナを使った EDM の構築
  • 既存データベースからの EDM 自動生成
  • 複数のデータアクセス
    Entity SQL => ほぼほぼ Transact-SQL と同じ構文で文字列としてクエリを書きます。
    クエリビルダ => メソッド構文でクエリを構築します。ただし、例えば Where メソッドに渡す検索条件などは生の文字列です。
    LINQ to Entities => LINQ to SQL とほぼ同じ構文でクエリを構築します。ですが、LINQ to SQL とは作った人たちが別になります。前者は ADO.NET チームで、後者は C# コンパイラチームです。

EF 1 は情報が少ないですねー。結局 Wikipedia から引っ張ってきてしまいました。なお、その目指すところは大いに共感を得ることが出来たものの、機能的に十分とは言えずあまり芳しくない評価だとかそうでもないとかどこかで読んだような…(ごにょごにょ

Entity Framework 4

Entity Framework 4 は、.NET Framework 4.0 に付属する形でリリースされました。いきなりバージョンが 4 に飛んでますが、実質的にはセカンドバージョンです。EF 1 に対する多くの不満を解消するアップデートになったらしいです。

主な新機能は

  • POCO(Plane Old CLR Object)のサポート http://www.atmarkit.co.jp/fdotnet/ef4basic/ef4basic05/ef4basic05_01.html
    Entity Framework 特有のクラス継承や属性を利用しなくてもエンティティを定義/操作可能になりました。これによって、ドメイン層(ビジネスロジック層)から Entity Framework への依存を切り離し、アプリケーションの階層化に対応出来る様になったそうです。
  • SQL の実行をサポート
  • 遅延読み込みサポート
  • 複合型の GUI による編集をサポート http://msdn.microsoft.com/ja-jp/library/vstudio/bb738472(v=vs.100).aspx http://www.atmarkit.co.jp/fdotnet/ef4basic/ef4basic04/ef4basic04_03.html Entity Framework におけるエンティティは、基本、テーブルと対応関係を持ちますが、複合型と呼ばれるエンティティはテーブルと紐付かず(紐づけられない)、テーブル上複数の属性を一つの型として表現し、テーブルと紐尽くエンティティが保持します。エンティティ上一つのプロパティの様に見えますが、テーブル上では関連するエンティティに対応するテーブルの複数の属性として表現されます。DDD で言う Value Object のことかなと理解しています。
  • テーブルの自動単数形/複数形変換サポート
  • 自動生成される SQL の改善とストアドプロシージャのサポート
  • LINQ 演算子の完全サポート
  • テストサポート
    設計がより疎結合になり、テストがしやすくなったそうです。
  • EDM からデータベースの自動生成 http://www.atmarkit.co.jp/fdotnet/ef4basic/ef4basic04/ef4basic04_03.html
  • 変更履歴の管理サポート 自己追跡エンティティと呼ばれる仕組みによって実現します。POCO オブジェクトに対して、変更を管理するオブジェクト(ObjectChangeTracker)をメンバとして持たせることと、Set プロパティにおいて、ObjectChangeTracker に対して変更を通知する処理を自動生成してくれます。この機能によって、楽観ロックや効率的な SQL の生成が出来る様になりました。

EF 4 は新機能がたくさんですね。この辺りから Entity Framework の名前をちょいちょい聞くようになり、私も情報集めたり触ったりしてました。

Entity Framework 4.1

Entity Framework 4.1 は、2011年4月に単体でリリースされました。

最初に挙げた @IT の参考サイトに詳しいですが、主な新機能は

  • コードファーストサポート デザイナを使った EDM を作成することなく、コードだけでデータベースの自動生成が可能になりました。もちろん、既存の DB に対しても適用可能です。
  • 設定より規約 Rails の様に、規約を多く作ることで設定を減らし、より効率的な開発をサポートしました。
  • より軽量な Context クラスのサポート 以前までの ObjectContext と呼ばれる、DB アクセス処理をカプセル化したクラスよりも軽量で、API が見直された DbContext クラスがサポートされました。

EF 4.1 のコードファーストで一気に Entity Framework がブレイクしたなーという印象です。ASP.NET MVC と組み合わせた Rails ライクな開発を Push してたような記憶が。

Entity Framework 4.2

Entity Framework 4.2 は、2011年11月に単体でリリースされました。

主な新機能というか、4.1 からの変更としては

  • バグフィックス
  • セマンティックバージョニングの採用 http://www.infoq.com/jp/news/2011/08/EF-Versioning .NET Framework の様に、ブランディングも含めたバージョニングではなく、一般的なライブラリのようにメジャーバージョン.マイナーバージョン.パッチバージョン(あるいはビルドやリリース等)という形にバージョンを定義しました。それぞれのアップデートルールを定めて .NET Framework とは独立してバージョンを上げていく方針になりました。

印象が…全く無い…(´;ω;`)

Entity Framework 4.3

Entity Framework 4.3 は、2012年2月に単体でリリースされました。

こちらに詳しいので是非ご一読を。
http://shiba-yan.hatenablog.jp/entry/20120114/1326477044

主な新機能は

誰かに聞かされて、「あれ?その機能って 4.1 にも無かったっけ?」とか思ってた記憶があります(えー

Entity Framework 5

Entity Framework 5 は、2012年8月に単体でリリースされました。
http://blogs.msdn.com/b/daisukei/archive/2012/08/17/entity-framework-5-ef5-ef-6.aspx

また、このタイミングで .NET Framework 4.5 をターゲットバージョンとしたようです。

新機能は

  • Enum サポート
  • Spatial データをサポート
    空間データ型がサポートされました。具体的には DbGeography 型、DbGeometry 型の二つで、前者は GPS 座標などに利用し、後者はは平面上の位置を表現することが出来ます。SQL Server には以前から空間データ型が存在したらしいですが、Entity Framework は特定の DB テクノロジに依存しないという方針から新たにデータ型を定義したそうです。
  • パフォーマンスの向上
  • コードファーストからデフォルト DB の自動探知 以前は SQL Express だけだったそうですが、適切な Local DB を自動選択してくれるようになったらしいです。

これから私が使おうとしているバージョンです。デフォルト DB の自動探知とかはそもそもそんな制限があったのか!って感じです。気になるので真っ先に検証してみます。

Entity Framework 6

Entity Framework 6 はまだリリースされていません。

ですが、既にアルファ 3 まで来ているそうです。
http://entityframework.codeplex.com/wikipage?title=Roadmap

以下予定している新機能です。

  • 非同期クエリ、非同期更新をサポート async / await 構文のサポートです。
  • コードファーストでストアドプロシージャとファンクションをサポート
  • 接続障害からの自動回復 http://www.infoq.com/jp/news/2013/03/ef-6-alpha-3
    クラウド環境下などで、一時的に接続が切断された場合に自動で再接続を行ってくれる機能です。
  • カスタム規約のサポート 既定の規約をオーバーライドしたり、新しい規約を追加可能になります。

最後に

速いペースでバージョンが上がっていくので、気を遣ってググってもごっちゃになって出てくるんですよね。バージョン毎の情報を集めるのは結構骨が折れました><

というか、調べるのに時間掛かって結局今日触っとらんやんけー