250 likes | 445 Views
MVC の M. あおい情報システム株式会社 小野 修司 Microsoft MVP for ASP.NET/IIS blogonos.wordpress.com twitter.com/ onos. アジェンダ. MVC の M として何を用いるか Entity Framework 4.1 CodeFirst OData 連携. Entity Framework 4.1 CodeFirst. Entity Framework 4.1 CodeFirst. demo. POCO クラス定義. データ構造を意識したクラス定義 主キー
E N D
MVC の M あおい情報システム株式会社 小野 修司 MicrosoftMVPforASP.NET/IIS blogonos.wordpress.comtwitter.com/onos
アジェンダ • MVC の M として何を用いるか • EntityFramework4.1CodeFirst • OData 連携
EntityFramework4.1CodeFirst demo ...
POCO クラス定義 • データ構造を意識したクラス定義 • 主キー • ナビゲーションプロパティ、外部キー • レイジーローディング • 計算項目 • クラス定義=テーブル設計 • 設定に勝る規約(ConventionoverConfiguration) • 属性による設定 • FluentAPI による設定(DbContext 内)
FluentAPI の例:[Required] public class GroupContext: DbContext { public DbSet<Member> Members { get; set; } public DbSet<Category> Categories { get; set; } protected override voidOnModelCreating(DbModelBuildermodelBuilder) { modelBuilder.Entity<Member>() .Property(m => m.Name).IsRequired(); } } #DB定義は同じになるが検証等のプログラム上の処理は異なる
DbContext定義 • クラスと DB のマッピングを設定 • 設定に勝る規約(CoC) • FluentAPI により詳細な設定
接続文字列定義 • 利用(構築)する DB の場所を設定 • 設定に勝る規約(CoC) • 該当する接続文字列がない場合、 SQLExpress インスタンスを利用 <add name=“GroupContext“ connectionString="Data Source=|DataDirectory|\Group.sdf" providerName="System.Data.SqlServerCe.4.0"/>
データベースの初期化 • Initializerクラス • DBの構築/修正 • 基底クラスにより設定 • POCOクラスの定義変更を即座にDBに反映可能 • 項目の初期値設定 • Seedメソッドのオーバーライド • 常に同じデータを設定-テスト環境として有効 • パッケージの初期値投入
スキャッフォールディング • コントローラー/ビューを一括追加 • DbContext(コードファースト)、ObjectContext(DBファースト/モデルファースト)を利用可能 • コントローラーでのデータの扱い方の参考となる • [参考]MvcScaffolding • NuGet からインストール • リポジトリパターン/ユニットテストコードも生成可
データ取得 ○単一データ取得 db.Members.Find(id); ○複数データ取得(リンクなし) db.Members.ToList(); ○複数データ取得(一括ローディング) db.Members.Include(m => m.Category).ToList();
データ追加/更新/削除 ○データ追加 db.Members.Add(member); db.SaveChanges(); ○データ更新(Attachして更新状態に変更) db.Entry(member).State = EntityState.Modified; db.SaveChanges(); ○データ削除 Member member= db.Members.Find(id); db.Members.Remove(member); db.SaveChanges();
DropDownListの使い方 ○コントローラーで SelectList を作成し、ViewBag.フィールド名 に詰め込む ViewBag.CategoryID = new SelectList(db.Categories, "CategoryID", "Name"); ○ビューではフィールド名とオプションラベルのみ指定 @Html.DropDownList("CategoryID", String.Empty)
バリデーション • 属性による設定 • スキャッフォールドで作成されるビューでは JQuery.Validate を利用しクライアント側で検証 • クラスレベルでの関連チェック • IValidatableObject を実装する • ValidationResult を yield で返す
同時実行制御 • 制御用の項目を作成 • Timestamp 属性を指定 • エラーハンドリング • View に制御用項目の Hidden フィールドを追加 • DbUpdateConcurrencyException をキャッチ
実行環境 • .NETFramework4 • MVC3ToolsUpdate のテンプレート • MVC3 の dll を参照済み • EF4.1 の dll を参照済み • SQLServerCompactを利用可 • 配置可能な依存関係の追加 • MVC3、SQLServerCompact • EF4.1 はローカルコピーを True に
WCFDataServicesとの連携 demo ...
WCFDataServices • 標準でODataを利用 • デフォルトのデータ表現はAtomPub • JSONにはHTTP要求ヘッダーにより対応
ODataクライアント • DataServiceContextを利用 • サービス参照の追加により自動生成 • LINQ ベースでデータを操作 • MetaData による検証属性の付加が可能
MVC の 「 M 」 • 用意されているデータアクセス機能をいかに活用するか • DbContext • ObjectContext • DataServiceContext.. . • LINQ によるデータ抽出 • データの追加/更新方法は Context により異なる
EntityFramework • http://msdn.microsoft.com/en-us/data/gg192989 • http://www.asp.net/entity-framework/tutorials • OData • http://www.odata.org/ • http://msdn.microsoft.com/en-us/data/hh237663 • WCFDataServices • http://msdn.microsoft.com/ja-jp/library/cc668792