Download presentation
Presentation is loading. Please wait.
Published byΜαγδαληνή Ρέντης Modified 約 5 年前
2
ADO.NET Entity Framework ディープ ダイブ ~ EF 4 アーキテクチャと実践的活用 ~
セッション ID:T4-402 ADO.NET Entity Framework ディープ ダイブ ~ EF 4 アーキテクチャと実践的活用 ~ アバナード株式会社 CTO オフィス Group Manager/CTO Architect 福井 厚
3
セッションの目的とゴール Session Objectives and Takeaways
ADO.NET Entity Framework をより深くご理解いただく (入門セッションではありません) Entity Framework の機能デモ セッションのゴール ADO.NET Entity Framework の機能を理解し、上司、同僚、部下に対して説明できるようになる 実際のアプリケーション開発で Entity Framework の活用を検討し、設計時に十分に考慮できるようになる
4
アジェンダ なぜ Entity Framework なのか? EF4 Quick Start! 状態管理 同時実行制御 (OCC)
多対多のエンティティ モデル Model To DB と DB To Model 状態管理 同時実行制御 (OCC) n層アプリケーションへの対応 パフォーマンスについての考慮点 コード ファースト おさらい おさらい 予備知識 予備知識 本題 本題 発展
5
なぜ Entity Framework なのか?
おさらい .NET Framework は、様々なデータ アクセス テクノロジを提供しています ADO.NET DataSet LINQ to SQL Entity Framework
6
DataSet メリット デメリット 変更セットを保持、レイヤーを跨ったデータの更新が容易 データベースのスキーマに強く依存
おさらい メリット 変更セットを保持、レイヤーを跨ったデータの更新が容易 デメリット データベースのスキーマに強く依存 異なるプラットフォームでのデータ交換が困難 変更前と変更後の情報を保持するためサイズが大きい
7
LINQ To SQL メリット デメリット LINQ のメリットを享受 最適な SQL の自動生成
おさらい メリット LINQ のメリットを享受 最適な SQL の自動生成 異なるプラットフォームでのデータ交換が容易 遅延ロードのサポート デメリット SQL Server に特化 Table や View と 1対1 マッピングのみサポート レイヤーをまたがった更新に工夫が必要
8
Entity Framework メリット デメリット LINQ のメリットを享受 オブジェクト指向プログラミングとの親和性
おさらい メリット LINQ のメリットを享受 オブジェクト指向プログラミングとの親和性 柔軟なテーブル マッピング 異なるプラットフォームでのデータ交換が容易 遅延ロードのサポート POCO や自己追跡エンティティのサポート デメリット 現在もまだ進化中
9
DEMO EF4 Quick Start! 多対多 エンティティの操作
10
多対多エンティティ モデル
11
多対多エンティティへの登録 using (var context = new TechEd10Entities()) {
var techedProject = new Project { Name = "TechEd Project", Members = { new Member { Name = "Fukui", TweetId = new Member { Name = "Moriya", TweetId = } }; context.Projects.AddObject(techedProject); context.SaveChanges();
12
遅延ロード 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 + ")" ); }
13
Entity Data Model (EDM) の概念
おさらい エンティティ型 Entity Data Model でデータ構造を記述するために不可欠な構成要素 継承をサポート アソシエーション型 Entity Data Model でリレーションシップを記述するために不可欠な構成要素 アソシエーションに含まれるエンティティ型を指定する 2 つのアソシエーション End がある アソシエーション End の多重度も指定する必要がある プロパティ エンティティ型には、その構造と特性を定義するプロパティが含まれる プロパティには、プリミティブ データ (文字列、整数、ブール値など) または構造化データ (複合型) を含めることができる
14
エンティティの継承 Table-Per-Type 継承 Table-Per-Hierarchy 継承
おさらい Table-Per-Type 継承 基本エンティティと派生エンティティでテーブルを分割 Table-Per-Hierarchy 継承 継承関係にあるエンティティをすべて単一のテーブルにマッピング
15
Table-Per-Type 継承
16
Table-Per-Hierarchy 継承
17
エンティティの継承の実現方法 Table-per-Type 継承 Table-per-Hierarchy 継承
おさらい Table-per-Type 継承 概念スキーマで派生型の BaseType 属性に基本エンティティ型を指定 基本エンティティを抽象型として定義 派生型の ID を削除 マッピングの詳細ウィンドウで ID を基本エンティティの ID にマップ Table-per-Hierarchy 継承 マッピングの詳細ウィンドウで「テーブルまたはビューの追加」からテーブルを選択
18
自動生成される 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,
19
状態管理 Entity Framework は ObjectContext から継承したコンテキストでエンティティの状態管理を行っている
予備知識 Entity Framework は ObjectContext から継承したコンテキストでエンティティの状態管理を行っている ObjectStateEntry ObjectStateManager によって管理される EntityState に状態を格納 アタッチされている各オブジェクトに対して作成される デタッチされると、対応する ObjectStateEntry オブジェクトがオブジェクト コンテキストから削除される
20
EntityState の状態 状態 説明 Added
予備知識 状態 説明 Added 新しいオブジェクトがオブジェクト コンテキストに追加されている。SaveChanges() メソッドは呼び出されていない。変更が保存されると、オブジェクトの状態は Unchanged に変更される。 Deleted オブジェクトがオブジェクト コンテキストから削除されている。変更が保存されると、オブジェクトの状態は Detached に変更される。 Detached オブジェクトが存在するが追跡されていない。エンティティは、作成された直後とオブジェクト コンテキストに追加される直前にこの状態になる。また、Detach(Object) メソッドを呼び出してコンテキストから削除された後、または NoTracking MergeOption を使用して読み込まれる場合にもこの状態になる。 Modified オブジェクトのスカラー プロパティのいずれかが変更されている。SaveChanges メソッドは呼び出されていない。変更追跡プロキシを持たない POCO エンティティでは、DetectChanges メソッドが呼び出されたときに、変更されているプロパティの状態が Modified に変わる。変更が保存されると、オブジェクトの状態は Unchanged に変わる。 Unchanged オブジェクトは、コンテキストに読み込まれた後、または最後に SaveChanges メソッドが呼び出されてから変更されていない。
21
DEMO EF4 状態管理 EntityState の確認
22
EntityState の確認 using (var context = new TechEd10Entities()) {
//オブジェクトの追加、更新処理をここで行う … Console.WriteLine( context.ObjectStateManager.GetObjectStateEntry( techedProject).State); }
23
同時実行制御 予備知識 エンティティ内の任意のプロパティの ConcurrencyMode を “Fixed” にすると Entity Framework は、変更をデータベースに保存する前に、データベース内の変更をチェックし、既に変更されている場合は例外を発生させる 楽観的同時実行制御 (OCC) SQL Server の場合、各テーブルにタイム スタンプ列を追加して指定すると良い 他のデータベースの場合はトリガーでタイム スタンプを更新するなどの工夫を
24
DEMO EF4 同時実行制御 同時更新時の動作の確認
25
n層アプリケーションへの対応 本題 アプリケーションの構造がなぜ変化するのか?
26
アプリケーション構造の変化 本題
27
パッケージの依存関係 本題
28
EF4 によるレイヤー間の転送パターン 本題 シンプルなエンティティ 変更セット 自己追跡エンティティ DTO (データ転送オブジェクト)
29
シンプルなエンティティ 単一エンティティの更新操作など単純な要件では利用可能 更新前と更新後の値を独自に保持
本題 単一エンティティの更新操作など単純な要件では利用可能 更新前と更新後の値を独自に保持 複雑なオブジェクト グラフの操作には向かない
30
変更セット DataSet で実現している機能 オブジェクトに対する更新の履歴を保持 データベースのスキーマに強く依存
本題 DataSet で実現している機能 オブジェクトに対する更新の履歴を保持 データベースのスキーマに強く依存 異なるプラットフォームでの相互運用が困難
31
自己追跡エンティティ EF4 が T4 テンプレートを提供しているので自動生成が可能 コード記述量が少ない 多くの場合、お勧めのパターン
本題 EF4 が T4 テンプレートを提供しているので自動生成が可能 コード記述量が少ない 多くの場合、お勧めのパターン
32
DTO クライアント側とサービス側で変換コードが必要 必要なコードの記述量が多い
本題 クライアント側とサービス側で変換コードが必要 必要なコードの記述量が多い DTO をうまく設計すると受け渡しに必要なデータだけに絞ることができる 不正な更新を防ぐことが可能
33
EF4 による n層パターンの比較 アーキテクチャの良さ 実装の容易さ DTO 自己追跡エンティティ シンプルなエンティティ 変更セット
本題 DTO 自己追跡エンティティ アーキテクチャの良さ シンプルなエンティティ 変更セット 実装の容易さ
34
DEMO 自己追跡エンティティ T4 テンプレートの利用
35
自己追跡エンティティ (クライアント側) 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);
36
自己追跡エンティティ (サービス側) using (NorthwindEntities context =
new NorthwindEntities()) { context.Customers.ApplyChanges(customer); context.SaveChanges(); }
37
EF4 パフォーマンス スタートアップ時に実行すること 最初のクエリ実行で行うこと モデル メタデータのロード EF クエリ ビューの生成
本題 スタートアップ時に実行すること モデル メタデータのロード EF クエリ ビューの生成 最初のクエリ実行で行うこと EF クエリの翻訳 クエリのキャッシング LINQ クエリの操作 リザルトの型のキャッシング
38
パフォーマンス Tips 本題 CompiledQuery クラス 読み取り専用クエリ 一括読み込み ストアド プロシージャの実行
39
DEMO パフォーマンス Tips 実証実験
40
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"); …
41
パフォーマンス Tips //読み取り専用カーソルの利用 Context.Customers.MergeOption =
MergeOption.NoTracking; //一括読み込み Context.ContextOption.LazyLoadEnabled = false; context.customers.Include("Orderes"); //ストアド プロシージャの利用 context.ExecuteStoreCommand( "UPDATE T set a = {0}", params);
42
コード ファースト 先にコードを記述して、そこからモデルやデータベース、テーブルを生成する
発展 先にコードを記述して、そこからモデルやデータベース、テーブルを生成する テスト駆動型開発と組み合わせて、コードを作りながらモデルを更新していく 初期段階でアジャイルにコードとデータ モデルを作っていくときに非常に有効
43
DEMO Code First CTP4 の機能
44
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; } }
45
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; } }
46
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();
47
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); }
48
エンティティの追加 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();
49
Convention over Configuration
発展 主キー 以下のパターンで主キーを推論 Id または、クラス名 + "Id" long、int、short の場合は、Identity 列カラムとして登録 リレーションシップ ナビゲーション プロパティが存在する 2 つのクラスがお互いの型をナビゲーション プロパティとして持っている場合は、1 つの リレーションとして扱う
50
Convention over Configuration
発展 外部キー 下記の場合、外部キーを登録 子クラス名 + 親クラスの主キー プロパティ名 親クラス名 + 主キー プロパティ名 主キー プロパティ名と同じ名前で同一の型
51
まとめ 必要に応じて、モデルから DB、DB からモデルを生成可能 エンティティの継承と SQL テーブルに対する柔軟なマッピング
状態の管理と同時実行制御の機能を提供 自己追跡エンティティ用テンプレートが利用可能 コード ファーストにより、よりアジャイルに開発が可能
52
関連セッション T6-401:WCF RIA Services を使った Silverlight 4 アプリケーション開発 ~ 迅速性と効率性の追求 ~ T4-303:Open Data Protocol (Odata) と WCF Data Services によるサービスの作成
53
リファレンス n 層アプリケーションのパターン n 層アプリケーションで回避すべきアンチパターン EF4 による n 層アプリケーションの構築 ADO.NET team blog (英語)
54
ご清聴ありがとうございました。 T4-402 アンケートにご協力ください。
55
© 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.
Similar presentations
© 2024 slidesplayer.net Inc.
All rights reserved.