ADO.NET Entity Framework ディープ ダイブ ~ EF 4 アーキテクチャと実践的活用 ~

Slides:



Advertisements
Similar presentations
ASP.NET MVC 3 と NuGet で始める 高速 Web アプリ開発 Microsoft MVP for ASP.NET/IIS 芝村 達郎 (しばむら たつろう) d.hatena.ne.jp/shiba-yand.hatena.ne.jp/shiba-yan twitter.com/shibayantwitter.com/shibayan.
Advertisements

マイクロソフトがホスティングする拡張性に優れたサービス ベース アプリケーション プラットフォーム.
この部分こそが必 要とされている ! Runtime 自身と Expression が カバーする!
Windows Azure ハンズオン トレーニング Windows Azure Web サイト入門.
Oscar Koenders Principal Group Program Manager Microsoft Corporation
第28回codeseek勉強会 WPF で簡単ビデオ再生 2008年5月27日(火)
D2-301 現時点の本資料は 完成版のスライドではありません。
MSON-B2 .NET Framework Web アプリケーション開発
Windows Summit /1/2017 © 2010 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be.
Windows Summit /1/2017 © 2010 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be.
Windows Summit /1/2017 © 2010 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be.
C# Programming .NET / C# Group 検索ワードでみる C#の困り事とその対策
3/2/2017 9:01 AM © 2007 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered.
Windows Phone アプリケーションでの データ視覚化
3/3/2017 8:49 AM © 2007 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered.
3/4/ :37 PM © 2007 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered.
Windows PowerShell 最新コマンドライン スクリプティング
Expression Blend 3で始めるSilverlight 3アプリケーション開発
ParadoxのLiveScripting事情
Using connected devices in Metro style apps Metro スタイル アプリで デバイスを使用する
3/11/2017 7:02 PM © 2007 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered.
3/11/ :57 PM © 2007 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered.
続 Entity Framework 入門 SQLWorld #8 サヴロウ.
Windows Summit /13/2017 © 2010 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be.
クラウド開発の高速道路 ~Visual Studio 2010 による Windows Azure アプリケーション開発~
MIX 09 3/14/2017 9:51 PM © 2009 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered.
3/15/ :37 AM © 2007 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered.
表紙です.
3/17/2017 1:49 AM © 2007 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered.
データはお客様に属し、かつ、コントロール可能
HP ProLiant DL980 G7 SQL Server 2008 R2 NUMA 環境 ベンチマークテスト結果報告書
ビジネスにおける オープンソースの利用価値
XAML の勉強不要! WPF アプリケーションは作れます
大学におけるクラウド活用の 最新動向と先進ソリューションの 事例
3/21/2017 3:39 AM © 2007 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered.
Using tiles and notifications タイルと通知の使用
3/21/2017 5:15 PM © 2007 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered.
[コース: A1] .NET Framework の基礎
Windows Summit /6/2017 © 2010 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be.
Windows Summit /8/2017 © 2010 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be.
Windows Summit /9/2017 © 2010 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be.
Microsoft Consumer Channels and Central Marketing Group
9/17/ :05 AM © 2007 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered.
Microsoft Partner Network Office 365 社内使用ライセンスの有効化
11/9/2018 3:35 AM Windows Azure Platform ハンズオン トレーニング Windows Azure アプリケーション開発概要 ~ Windows Azure 入門編 ~ © 2007 Microsoft Corporation. All rights reserved.
11/16/ :27 AM © 2007 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered.
Windows Summit /22/2018 © 2010 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may.
Windows Summit /24/2018 © 2010 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may.
[コース: B3] .NET Framework 2.0 分散アプリケーション開発
Expression Blend 3で始めるSilverlight 3アプリケーション開発
Chad Siefert Senior Test Lead Microsoft Corporation
Windows Azure 通知ハブ.
12/9/ :14 AM © 2007 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered.
suppose to be expected to be should be
Microsoft Visual Studio 2005 Tools for
.NET Framework 3.0 概要 (旧称 : WinFX)
Windows Summit /21/2019 © 2010 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be.
Windows Summit /22/2019 © 2010 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be.
.NET 4 時代の Windows Azure アーキテクチャ選択
MIX 09 2/23/2019 1:22 PM © 2009 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered.
Max Morris Principal Program Manager Microsoft Corporation
Windows Summit /24/2019 © 2010 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be.
主要関係者の特定用テンプレート Windows 10 and Office 365 導入ステップ 2/24/2019
Yochay Kiriaty Senior Technical Evangelist Microsoft® Corporation
~ 第5回 認証のためのプロキシー Web Application Proxy
Craig Rowland Senior Program Manager Microsoft Corporation
Microsoft Consumer Channels and Central Marketing Group
Windows Summit 2010 © 2010 Microsoft Corporation.All rights reserved.Microsoft、Windows、Windows Vista およびその他の製品名は、米国 Microsoft Corporation の米国およびその他の国における登録商標または商標です。
Windows Summit /22/2019 © 2010 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be.
Windows Azure メディアサービス
Presentation transcript:

ADO.NET Entity Framework ディープ ダイブ ~ EF 4 アーキテクチャと実践的活用 ~ セッション ID:T4-402 ADO.NET Entity Framework ディープ ダイブ ~ EF 4 アーキテクチャと実践的活用 ~ アバナード株式会社 CTO オフィス Group Manager/CTO Architect 福井 厚

セッションの目的とゴール Session Objectives and Takeaways ADO.NET Entity Framework をより深くご理解いただく (入門セッションではありません) Entity Framework の機能デモ セッションのゴール ADO.NET Entity Framework の機能を理解し、上司、同僚、部下に対して説明できるようになる 実際のアプリケーション開発で Entity Framework の活用を検討し、設計時に十分に考慮できるようになる

アジェンダ なぜ Entity Framework なのか? EF4 Quick Start! 状態管理 同時実行制御 (OCC) 多対多のエンティティ モデル Model To DB と DB To Model 状態管理 同時実行制御 (OCC) n層アプリケーションへの対応 パフォーマンスについての考慮点 コード ファースト おさらい おさらい 予備知識 予備知識 本題 本題 発展

なぜ Entity Framework なのか? おさらい .NET Framework は、様々なデータ アクセス テクノロジを提供しています ADO.NET DataSet LINQ to SQL Entity Framework

DataSet メリット デメリット 変更セットを保持、レイヤーを跨ったデータの更新が容易 データベースのスキーマに強く依存 おさらい メリット 変更セットを保持、レイヤーを跨ったデータの更新が容易 デメリット データベースのスキーマに強く依存 異なるプラットフォームでのデータ交換が困難 変更前と変更後の情報を保持するためサイズが大きい

LINQ To SQL メリット デメリット LINQ のメリットを享受 最適な SQL の自動生成 おさらい メリット LINQ のメリットを享受 最適な SQL の自動生成 異なるプラットフォームでのデータ交換が容易 遅延ロードのサポート デメリット SQL Server に特化 Table や View と 1対1 マッピングのみサポート レイヤーをまたがった更新に工夫が必要

Entity Framework メリット デメリット LINQ のメリットを享受 オブジェクト指向プログラミングとの親和性 おさらい メリット LINQ のメリットを享受 オブジェクト指向プログラミングとの親和性 柔軟なテーブル マッピング 異なるプラットフォームでのデータ交換が容易 遅延ロードのサポート POCO や自己追跡エンティティのサポート デメリット 現在もまだ進化中

DEMO EF4 Quick Start! 多対多 エンティティの操作

多対多エンティティ モデル

多対多エンティティへの登録 using (var context = new TechEd10Entities()) { var techedProject = new Project { Name = "TechEd Project", Members = { new Member { Name = "Fukui", TweetId = "@afukui"}, new Member { Name = "Moriya", TweetId = "@hmoriya55"} } }; context.Projects.AddObject(techedProject); context.SaveChanges();

遅延ロード var q = from p in context.Projects select p; foreach (var project in q) { Console.WriteLine(project.Name); foreach (var member in project.Members) Console.WriteLine("\t" + member.Name + " (" + member.TweetId + ")" ); }

Entity Data Model (EDM) の概念 おさらい エンティティ型 Entity Data Model でデータ構造を記述するために不可欠な構成要素 継承をサポート アソシエーション型 Entity Data Model でリレーションシップを記述するために不可欠な構成要素 アソシエーションに含まれるエンティティ型を指定する 2 つのアソシエーション End がある アソシエーション End の多重度も指定する必要がある プロパティ エンティティ型には、その構造と特性を定義するプロパティが含まれる プロパティには、プリミティブ データ (文字列、整数、ブール値など) または構造化データ (複合型) を含めることができる

エンティティの継承 Table-Per-Type 継承 Table-Per-Hierarchy 継承 おさらい Table-Per-Type 継承 基本エンティティと派生エンティティでテーブルを分割 Table-Per-Hierarchy 継承 継承関係にあるエンティティをすべて単一のテーブルにマッピング

Table-Per-Type 継承

Table-Per-Hierarchy 継承

エンティティの継承の実現方法 Table-per-Type 継承 Table-per-Hierarchy 継承 おさらい Table-per-Type 継承 概念スキーマで派生型の BaseType 属性に基本エンティティ型を指定 基本エンティティを抽象型として定義 派生型の ID を削除 マッピングの詳細ウィンドウで ID を基本エンティティの ID にマップ Table-per-Hierarchy 継承 マッピングの詳細ウィンドウで「テーブルまたはビューの追加」からテーブルを選択

自動生成される SQL の一部 (Table-Per-Type 継承の例) CREATE TABLE [dbo].[Parties] ( [Id] int IDENTITY(1,1) NOT NULL, [Name] nvarchar(max) NOT NULL ); GO CREATE TABLE [dbo].[Parties_Organization] ( [Location] nvarchar(max) NOT NULL, [Id] int NOT NULL CREATE TABLE [dbo].[Parties_Person] ( [Age] int NOT NULL,

状態管理 Entity Framework は ObjectContext から継承したコンテキストでエンティティの状態管理を行っている 予備知識 Entity Framework は ObjectContext から継承したコンテキストでエンティティの状態管理を行っている ObjectStateEntry ObjectStateManager によって管理される EntityState に状態を格納 アタッチされている各オブジェクトに対して作成される デタッチされると、対応する ObjectStateEntry オブジェクトがオブジェクト コンテキストから削除される

EntityState の状態 状態 説明 Added 予備知識 状態 説明 Added 新しいオブジェクトがオブジェクト コンテキストに追加されている。SaveChanges() メソッドは呼び出されていない。変更が保存されると、オブジェクトの状態は Unchanged に変更される。 Deleted オブジェクトがオブジェクト コンテキストから削除されている。変更が保存されると、オブジェクトの状態は Detached に変更される。 Detached オブジェクトが存在するが追跡されていない。エンティティは、作成された直後とオブジェクト コンテキストに追加される直前にこの状態になる。また、Detach(Object) メソッドを呼び出してコンテキストから削除された後、または NoTracking MergeOption を使用して読み込まれる場合にもこの状態になる。 Modified オブジェクトのスカラー プロパティのいずれかが変更されている。SaveChanges メソッドは呼び出されていない。変更追跡プロキシを持たない POCO エンティティでは、DetectChanges メソッドが呼び出されたときに、変更されているプロパティの状態が Modified に変わる。変更が保存されると、オブジェクトの状態は Unchanged に変わる。 Unchanged オブジェクトは、コンテキストに読み込まれた後、または最後に SaveChanges メソッドが呼び出されてから変更されていない。

DEMO EF4 状態管理 EntityState の確認

EntityState の確認 using (var context = new TechEd10Entities()) { //オブジェクトの追加、更新処理をここで行う … Console.WriteLine( context.ObjectStateManager.GetObjectStateEntry( techedProject).State); }

同時実行制御 予備知識 エンティティ内の任意のプロパティの ConcurrencyMode を “Fixed” にすると Entity Framework は、変更をデータベースに保存する前に、データベース内の変更をチェックし、既に変更されている場合は例外を発生させる 楽観的同時実行制御 (OCC) SQL Server の場合、各テーブルにタイム スタンプ列を追加して指定すると良い 他のデータベースの場合はトリガーでタイム スタンプを更新するなどの工夫を

DEMO EF4 同時実行制御 同時更新時の動作の確認

n層アプリケーションへの対応 本題 アプリケーションの構造がなぜ変化するのか?

アプリケーション構造の変化 本題

パッケージの依存関係 本題

EF4 によるレイヤー間の転送パターン 本題 シンプルなエンティティ 変更セット 自己追跡エンティティ DTO (データ転送オブジェクト)

シンプルなエンティティ 単一エンティティの更新操作など単純な要件では利用可能 更新前と更新後の値を独自に保持 本題 単一エンティティの更新操作など単純な要件では利用可能 更新前と更新後の値を独自に保持 複雑なオブジェクト グラフの操作には向かない

変更セット DataSet で実現している機能 オブジェクトに対する更新の履歴を保持 データベースのスキーマに強く依存 本題 DataSet で実現している機能 オブジェクトに対する更新の履歴を保持 データベースのスキーマに強く依存 異なるプラットフォームでの相互運用が困難

自己追跡エンティティ EF4 が T4 テンプレートを提供しているので自動生成が可能 コード記述量が少ない 多くの場合、お勧めのパターン 本題 EF4 が T4 テンプレートを提供しているので自動生成が可能 コード記述量が少ない 多くの場合、お勧めのパターン

DTO クライアント側とサービス側で変換コードが必要 必要なコードの記述量が多い 本題 クライアント側とサービス側で変換コードが必要 必要なコードの記述量が多い DTO をうまく設計すると受け渡しに必要なデータだけに絞ることができる 不正な更新を防ぐことが可能

EF4 による n層パターンの比較 アーキテクチャの良さ 実装の容易さ DTO 自己追跡エンティティ シンプルなエンティティ 変更セット 本題 DTO 自己追跡エンティティ アーキテクチャの良さ シンプルなエンティティ 変更セット 実装の容易さ

DEMO 自己追跡エンティティ T4 テンプレートの利用

自己追跡エンティティ (クライアント側) var svc = new ChannelFactory<ICustomerService>( binding, address).CreateChannel(); var customers = svc.GetCustomers(); var products = svc.GetProducts(); var customer = customers.Where( c => c.CustomerID == "ALFKI").FirstOrDefault(); customer.ContactName = "Bill Gates"; customer.Orders.Add(newOrder); svc.UpdateCustomer(customer);

自己追跡エンティティ (サービス側) using (NorthwindEntities context = new NorthwindEntities()) { context.Customers.ApplyChanges(customer); context.SaveChanges(); }

EF4 パフォーマンス スタートアップ時に実行すること 最初のクエリ実行で行うこと モデル メタデータのロード EF クエリ ビューの生成 本題 スタートアップ時に実行すること モデル メタデータのロード EF クエリ ビューの生成 最初のクエリ実行で行うこと EF クエリの翻訳 クエリのキャッシング LINQ クエリの操作 リザルトの型のキャッシング

パフォーマンス Tips 本題 CompiledQuery クラス 読み取り専用クエリ 一括読み込み ストアド プロシージャの実行

DEMO パフォーマンス Tips 実証実験

CompiledQuery クラス static readonly Func<Teched10Entities, string, IQueryable<Project>> myQuery = CompiledQuery.Compile<Teched10Entities, string, IQueryable<Project>>( (ctx, memberName) => from p in ctx.Projects where p.Members.Any( m => m.Name == memberName) orderby p.Name select p); private static void CompiledQuerySmaple(){ using (var context = new Teched10Entities()){ var projects = myQuery.Invoke(context, "Atsushi Fukui"); …

パフォーマンス Tips //読み取り専用カーソルの利用 Context.Customers.MergeOption = MergeOption.NoTracking; //一括読み込み Context.ContextOption.LazyLoadEnabled = false; context.customers.Include("Orderes"); //ストアド プロシージャの利用 context.ExecuteStoreCommand( "UPDATE T set a = {0}", params);

コード ファースト 先にコードを記述して、そこからモデルやデータベース、テーブルを生成する 発展 先にコードを記述して、そこからモデルやデータベース、テーブルを生成する テスト駆動型開発と組み合わせて、コードを作りながらモデルを更新していく 初期段階でアジャイルにコードとデータ モデルを作っていくときに非常に有効

DEMO Code First CTP4 の機能

POCO クラス public class Book { public string ISBN { get; set; } public string Title { get; set; } public DateTime FirstPublished { get; set; } public bool IsFiction { get; set; } public virtual Publisher Publisher { get; set; } public virtual Author Author { get; set; } }

DbContext public class SimpleBookCatalog : DbContext { public SimpleBookCatalog(DbModel model) : base(model) { } public DbSet<Book> Books { get; set; } public DbSet<Person> People { get; set; } public DbSet<Author> Authors { get; set; } public DbSet<Publisher> Publishers { get; set; } }

ModelBuilder var builder = new ModelBuilder(); builder.Configurations.Add( new BookConfiguration()); builder.Entity<Person>(); builder.Entity<Publisher>().Property( p => p.Name).IsRequired().HasMaxLength(50); var model = builder.CreateModel();

EntityConfiguration<T> public class BookConfiguration : EntityConfiguration<Book> { public BookConfiguration() this.HasKey(b => b.ISBN); this.Property(b => b.Title).IsRequired(); this.HasRequired(b => b.Author). WithMany(a => a.Books); }

エンティティの追加 using (var context = new SimpleBookCatalog(model)) { var book = new Book { ISBN = "2222", Title = "Intro to Code First", FirstPublished = DateTime.Today, Author = new Author { FirstName = “Atsushi”, LastName = "Fukui" }, Publisher = new Publisher { Name = "EF Books" } }; context.Books.Add(book); context.SaveChanges();

Convention over Configuration 発展 主キー 以下のパターンで主キーを推論 Id または、クラス名 + "Id" long、int、short の場合は、Identity 列カラムとして登録 リレーションシップ ナビゲーション プロパティが存在する 2 つのクラスがお互いの型をナビゲーション プロパティとして持っている場合は、1 つの リレーションとして扱う

Convention over Configuration 発展 外部キー 下記の場合、外部キーを登録 子クラス名 + 親クラスの主キー プロパティ名 親クラス名 + 主キー プロパティ名 主キー プロパティ名と同じ名前で同一の型

まとめ 必要に応じて、モデルから DB、DB からモデルを生成可能 エンティティの継承と SQL テーブルに対する柔軟なマッピング 状態の管理と同時実行制御の機能を提供 自己追跡エンティティ用テンプレートが利用可能 コード ファーストにより、よりアジャイルに開発が可能

関連セッション T6-401:WCF RIA Services を使った Silverlight 4 アプリケーション開発 ~ 迅速性と効率性の追求 ~ T4-303:Open Data Protocol (Odata) と WCF Data Services によるサービスの作成

リファレンス n 層アプリケーションのパターン http://msdn.microsoft.com/ja-jp/magazine/ee321569.aspx n 層アプリケーションで回避すべきアンチパターン http://msdn.microsoft.com/ja-jp/magazine/dd882522.aspx EF4 による n 層アプリケーションの構築 http://msdn.microsoft.com/ja-jp/magazine/ee335715.aspx ADO.NET team blog (英語) http://blogs.msdn.com/b/adonet/

ご清聴ありがとうございました。 T4-402 アンケートにご協力ください。

© 2010 Microsoft Corporation. All rights reserved © 2010 Microsoft Corporation. All rights reserved. Microsoft, Windows and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries. The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation. MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.