「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -戻る --[[データアクセスのいろいろ]] --[[ADO.NET vs ORM (Entity Framework, Dapper)]] * 目次 [#s84ee5e9] #contents *概要 [#e1c8710d] .NET Framework 3.5 SP1で追加されたデータベースアクセステクノロジー -Entity Frameworkは、TableAdapter と比べ、より高次の機能を提供し、高い生産性を誇る RAD ツールです。 -データアクセス部分を隠ぺいするため、データベースの種類や構造を意識することなくプログラミングできます。 -反面、実際に発行される SQL 文の構築は Entity Framework に委ねられます。 -このため、チューニングや、柔軟なデータの参照・更新が課題になりやすく、~ ミッション クリティカルなエンタープライズ システム開発には適合しないことがあります。 **概念モデルに対してプログラミング [#g3c9b5e5] 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) [#se4e2907] 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 [#u45bdd9b] CSDL(Conceptual Schema Definition Language:概念スキーマ定義言語)~ 概念スキーマ(概念モデル) -CSDL 仕様~ http://msdn.microsoft.com/ja-jp/library/vstudio/bb399292.aspx ***MSL [#eb804616] MSL(Mapping Schema Language:マッピング・スキーマ言語)~ CSDLとSSDL(モデル間)のマッピング -MSL 仕様~ http://msdn.microsoft.com/ja-jp/library/vstudio/bb399202.aspx ***SSDL [#r9199843] SSDL(Storage Schema Definition Language:ストア・スキーマ定義言語)~ ストレージ・スキーマ(ストレージ モデル) -SSDL 仕様~ http://msdn.microsoft.com/ja-jp/library/vstudio/bb399559.aspx ** xxx ファースト [#m1aabfea] -エンタープライズではほぼ、DBファーストを採用する。 -単純なテーブル(データストア)しか使用しない~ EUCなどの世界では、モデルファーストもマッチする可能性がある。 ***モデルファースト [#e8fd5f15] モデル(EDM)からDBMSのスキーマを生成する方法 -連載:ADO.NET Entity Framework入門 - @IT --第2回 EDMにおける多対多関係とEntity Frameworkでのデータの取得/保存~ http://www.atmarkit.co.jp/fdotnet/ef4basic/ef4basic02/ef4basic02_01.html > +多対多関係の実現 +EDMからデータベースの自動生成~ http://www.atmarkit.co.jp/fdotnet/ef4basic/ef4basic02/ef4basic02_02.html +Entity Frameworkで自動生成されるクラス +Entity Frameworkでのデータ保存/取得サンプル ***DBファースト [#k0847c21] DBMSのスキーマからモデル(EDM)を生成する方法 -連載:ADO.NET Entity Framework入門 - @IT~ 第4回 データベースからのEntity Data Model生成~ http://www.atmarkit.co.jp/fdotnet/ef4basic/ef4basic04/ef4basic04_01.html > +データベースからのEDM生成 +ストアド・プロシージャの呼び出し +複合型の活用/まとめ ***コードファースト [#rcec17e4] -ADO.NET Entity Framework 4.1 で登場した機能。 -Entityへのデータ構造の定義が、そのままデータベースのテーブル設計となる。 --ASP.NET MVC のModel(Entity)でデータ構造を定義すると、~ その定義に従ってデータベースにテーブルが作成される。 --ソースコードのみで完結し、~ Entity Framework のEntity Data Model (EDM) などを~ 明示的に作成する必要がなくなるため、より迅速な開発が可能となる。 -参考 --Entity Framework Code First | densan-labs.net~ http://densan-labs.net/tech/codefirst/index.html --既存のデータベースでEF『コード・ファースト』を使用 (1/4):CodeZine(コードジン)~ https://codezine.jp/article/detail/5400 --第5回 POCOによるエンティティ・クラス - @IT~ http://www.atmarkit.co.jp/fdotnet/ef4basic/ef4basic05/ef4basic05_03.html ---Entity Framework 4でコード・ファースト開発 - @IT~ http://www.atmarkit.co.jp/fdotnet/scottgublog/20100726codefirst/codefirst.html *CRUD処理 [#t3428a33] -4. データの挿入、読み出し、更新、削除 | densan-labs.net~ http://densan-labs.net/tech/codefirst/adddelete.html ここでは、「context」がDbContextを継承したコンテキストを指している。~ サンプルプログラム次第で、context, db, dbContextなどの名称が使用される。 **仕組み [#rea26718] ***Entity States [#zd380b94] Entityは以下のEntity Statesを持っており、 -Unchanged状態~ 追跡開始後に変更されていない状態 -Added状態~ 追加された状態。 -Modified状態~ 編集された状態。 -Deleted状態~ 削除された状態。 -Detached状態~ 追跡が開始されていない状態 ***SaveChanges()メソッド [#u73b2b58] SaveChanges()メソッドを呼び出した際に、~ コレを更新系SQLに変えて実行すると言う、ある種、~ RowState + TableAdapter的な仕組みで動作している。 **参照系 [#tc33cb30] ***LINQは遅延評価 [#eb4398f5] LINQは遅延評価なので、結果が必要になるまではSql文が発行されない。 [[ToArray()メソッド>Entity Framework の懸念#d887a52f]]や、[[Load()メソッド>Entity Framework の懸念#ac9d6a53]]を使うと、~ 即時実行されて結果をメモリに起こす事ができる。 ***オブジェクト参照 [#s28b7a9f] オブジェクト参照によりSQLが実行される。 using (var context = new XXXXXContext()) { foreach (var YYYYY in context.YYYYYs) { Console.WriteLine(YYYYY.Name); } } ***単一要素取得のLINQメソッド [#y0fe17de] -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. -参考 --FirstOrDefaultとかLastなど単一要素取得のLINQメソッド - Qiita~ http://qiita.com/RyotaMurohoshi/items/0d4cf421e0eb4a9b4765 ---ElementAt ---ElementAtOrDefault ---First ---FirstOrDefault ---Single ---SingleOrDefault ***[[LINQ to Object>LINQ#b29ceb6f]] [#t2396e97] 以下の様な感じ。 -[[ToArray()メソッド>Entity Framework の懸念#d887a52f]]で確定させた結果に対してLINQを実行する。 var YYYYYs = context.YYYYYs.ToArray(); YYYYYs.Where(x => x.Name == "hogehoge") -[[Load()メソッド>Entity Framework の懸念#ac9d6a53]]でキャッシュした後に、~ Localプロパティに対してLINQを実行する。 context.YYYYYs.Load() context.YYYYYs.Local.OrderBy(x => x.Name); 詳しくは、[[LINQ to Object>LINQ#b29ceb6f]]を参照。 ***[[LINQ to Entities>#b48c3a6f]] [#me91998f] 以下の様な感じ。 context.YYYYYs.Where(x => x.Id == "1"); context.YYYYYs.Where(x => x.Name == "hogehoge").ToArray(); ***注意 [#f6252c64] [[全体的に実行されるSQLがブラックボックスで性能を意識し難い。>Entity Framework の懸念#iec49e1b]] **更新系 [#x69c42b1] ***Insert [#n5790853] 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 [#k94f6862] using (var context = new XXXXXContext()) { var yyyyy = context.YYYYYs.Single(x => x.Name == "hogehoge"); yyyyy.Name = "Aiueo"; context.SaveChanges(); } ***Delete [#te140de3] -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(); } *参考 [#n42d5d9a] -Entity Framework のお役立ち記事まとめ ある SE のつぶやき~ http://fnya.cocolog-nifty.com/blog/2014/01/entity-frame-13.html **[[Entity Framework の懸念]] [#v8436077] **[[Entity Framework の調査]] [#tbf4dc1f] **LINQ to Entities [#b48c3a6f] -[[LINQ]]との関連もチェックして下さい。 -書籍転載:ASP.NET MVC 5 実践プログラミング - LINQとは?[C#] - Build Insider~ http://www.buildinsider.net/web/bookaspmvc5/050301 -連載:ADO.NET Entity Framework入門 - @IT~ 第3回 Entity Frameworkにおけるクエリと更新~ http://www.atmarkit.co.jp/fdotnet/ef4basic/ef4basic03/ef4basic03_02.html -LINQ to Entities~ http://msdn.microsoft.com/ja-jp/library/vstudio/bb386964.aspx >LINQ to Entities, QueryBuilder, Entity SQL --Entity SQL~ http://www.atmarkit.co.jp/fdotnet/ef4basic/ef4basic03/ef4basic03_01.html の前半 --QueryBuilder~ http://www.atmarkit.co.jp/fdotnet/ef4basic/ef4basic03/ef4basic03_01.html の後半 --LINQ to Entities~ http://www.atmarkit.co.jp/fdotnet/ef4basic/ef4basic03/ef4basic03_02.html **[[Entity Framework Core]] [#d5dbf31f] **@IT [#a721f612] -.NETの新データアクセス・テクノロジ「ADO.NET Entity Framework」 - @IT~ http://www.atmarkit.co.jp/fdotnet/special/vs2008sp1ef/vs2008sp1ef_01.html -連載: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 [#r18bce51] -エンティティ フレームワークの概要~ https://docs.microsoft.com/ja-jp/dotnet/framework/data/adonet/ef/overview -パフォーマンスに関する考慮事項 (Entity Framework)~ https://docs.microsoft.com/ja-jp/dotnet/framework/data/adonet/ef/performance-considerations **MSDN [#n8565ab6] -Entity Framework~ https://msdn.microsoft.com/ja-jp/data/ef.aspx --Entity Framework Development Workflows Video~ https://msdn.microsoft.com/ja-jp/data/jj590134 ***magazine [#ne128139] -データ ポイント --Dapper、Entity Framework、およびハイブリッド アプリ~ https://msdn.microsoft.com/ja-jp/magazine/mt703432.aspx --EF Core の変更追跡の動作: 変更なし、変更済み、および追加~ https://msdn.microsoft.com/magazine/mt767693 --.NET Framework と .NET Core の両方での EF Core の実行~ https://msdn.microsoft.com/magazine/mt742867 --EF Core 1.1: お気に入りをいくつか~ https://msdn.microsoft.com/ja-jp/magazine/mt745093 --EF Core と InMemory プロバイダーを使ったテスト作成のヒント~ https://msdn.microsoft.com/ja-jp/magazine/mt797648 --DDD に最適な EF Core 2.0~ https://msdn.microsoft.com/ja-jp/magazine/mt842503 --DDD に最適な EF Core 2.0 (第 2 部)~ https://msdn.microsoft.com/ja-jp/magazine/mt826347 ***blogs [#hf8bec46] -雲のごとく - Site Home - MSDN Blogs --.NET Framework 4.5 におけるデータ アクセスの概要 その1~ http://blogs.msdn.com/b/daisukei/archive/2014/07/29/net-framework-4-5.aspx --.NET Framework 4.5 におけるデータ アクセスの概要 その 3 ~ ADO.NET Entity Framework~ http://blogs.msdn.com/b/daisukei/archive/2014/08/29/net-framework-4-5-3-ado-net-entity-framework.aspx --Entity Framework Core 1.0 正式リリース – 雲のごとく~ https://blogs.msdn.microsoft.com/daisukei/2016/06/28/entity-framework-core-1-0-%E6%AD%A3%E5%BC%8F%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9/ --ADO.NET Entity Framework | slideshare ---http://www.slideshare.net/daisukei/daisukei-ef/11 ---http://www.slideshare.net/daisukei/daisukei-ef/38 **比較関連 [#y3af36d5] ***[[Entity Framework の懸念]] [#v8436077] ***[[Entity Framework の調査]] [#tbf4dc1f] ***[[ADO.NET vs ORM (Entity Framework, Dapper)]] [#od76c2f4] ---- Tags: [[:.NET開発]], [[:データアクセス]], [[:ADO.NET]], [[:Entity Framework]]