先日よりMSDN Subscription上で日本語版 Beta2が公開されています。
今回は、このVisual Studio 2010 Beta 2を使用して、Windows 7 のジャンプリストを操作してみます。
ちなみに、同僚のエバンジェリスト岩田のブログでは、既に手続き型のコードによる手法が記載されていますので、こちらはWPF(XAML)を使用してみます。
■手順1
WPFアプリケーションを新規作成します。
■手順2
App.xamlを開きます。
■手順3
Boldの部分のコードを追加します。
■手順4
実行して確認します。
上記のように、非常に簡単な手順でジャンプリストを操作することが可能です。
ここには書いていませんが、サムネイルツールバーやサムネイルボタンなどの実装もWPFで可能です。もちろんデータバインドすることも出来ます。
ロジックは手続き型、UIは宣言型と分離することがWPFの利点の一つなのですが、Windows7の機能実装でも、この性格が生きていることが分かると思います。
Windows FormからWPFに移行する時期が来たのかなと思って頂けると幸いです。
先日よりリリースされています。
Visual Studio 2010 Beta 2
http://msdn.microsoft.com/en-us/vstudio/dd582936.aspx
このブログで取り上げているADO.NET Entity FrameworkとADO.NET Data Servicesですが、それぞれUpdateがあります。
EFに関しては、弊社の井上ブログに紹介されています。http://blogs.msdn.com/daisukei/archive/2009/10/21/entity-framework-4-beta-2.aspx
ここではADO.NET Data Servicesについてご紹介します。
射影:クライアントとサーバーライブラリに対して射影の機能がサポートされます。要するに、LINQ to ADO.NET DataServicesのSelectでメンバーの選択(列の選択)が可能だと。
データバインド: WPFとSilverlightでのTwoWayバインディングのサポートです。
Row Count: 行の数のみの取得が可能です、これまではデータの取得が必要でした。
Feed Customization (aka "Web Friendly Feeds"):AtomPubが持つプロパティに対してデータをマップできます。以下が分かりやすいです。http://blogs.msdn.com/phaniraj/archive/2009/08/31/introducing-web-friendly-feeds-aka-friendly-feeds-updated-for-ctp2.aspx
例えば、AtomPubには著者(author)があるのですが、こうした情報の利用が可能です。
Server Driven Paging (SDP):一度のリクエストで取得できるデータ件数の制限が可能です。これによって、例えば写真サービスなどのリクエストでは、自動的にページングができるようになります。AtomPub <link rel="next" ...> で次のページリンクが出るようです。
Enhanced BLOB Support: 画像などのBLOBファイルの遅延ロードが可能になります。
Request Pipeline: リクエストのパイプライン処理をある程度カスタマイズ出来るようになるようです。これで細かな動きの確認ができるようになると思われます。
New "Data Service Provider" Interface for Custom Provider Writers: カスタムプロバイダーのインターフェイスです
詳細はこちらより
これらの機能は先日v1.5CTP2が公開されたのですが、そちらの機能を取り込んだ形になっているようです。
EFと比べると、そんなに大きな違いは内容に思います。(そもそもがv1.5ベースですからね・・・)
ですが、真摯にWeb(分散)開発を行う場合、必要になる機能も多いのでは?と感じました。
すみません、このところブログかけていません・・・
(Persistence Ignoranceネタも放置されています、近々書きます・・・)
その間にWindows7が販売開始されました。イベントも多く報道されましたので、ご存知の方も多いと思います。
それに合わせて開発者の方向けにハンズオンラボも着々と数を増やしています。
http://msdn.microsoft.com/ja-jp/windows/aa904962.aspx
Windows7は現在のところはSDK(ネイティブ)かCodePack(.NET Framework)を使用する形になりますが、Visual Studio 2010 Beta2もリリースされていますので、.NET Frameworkを用いたWondwos7開発を行なうことも出来るようになります。これも機会があればご紹介したいと思います。
ちょっと時間が空いてしまい申し訳ありません。
前回のお話通り、ADO.NET Entity FrameworkでPersistence Ignoranceのデモをご紹介してみたいのですが、といいながら、まずは、Entity Framework Feature CTP 1を用いたPOCOでのEntity作成をご紹介します。
■開発環境
以下をインストールします。
VS2010 英語版
http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=85520793-68fc-4361-a8b6-dc2cff49c8d2
Entity Framework Feature CTP 1
http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=7fd7164e-9e73-43f7-90ab-5b2bf2577ac9
■手順1
ConsoleApplicationを新規作成して、AddNewItemでADO.NET Entity Data Modelを追加します。
今回は、pubsデータベースを使用します。
pubsデータベースはこちらから。
http://msdn2.microsoft.com/ja-jp/library/ms143221.aspx
今回はjobsテーブルのみを使用します。
■手順2
pubs.edmxのデザイナ上で右クリックしてAdd New Artifact Itemを選択します。
EntitFramework POCO Code Generatorを選択します。ファイル名は、ココではpubs.ttとしました。
Warningが2回ほど出ますが、気にせずOKを押します。
そうすると、下図のようにpubs.Context.ttと、pubs.Types.ttというファイルができます。
同時にpubs.edmxのコードビハインドが削除されます。(プロパティのCustomToolもクリアされます)
このpubs.Types.ttがPOCOで作成されたEntityであり、pubs.Context.ttは、消えてしまったContextのプログラムコードに相当します。(なお、この.ttファイルはT4テンプレートファイルといいます。テンプレートの変更は次回ご紹介します。)
一応確認のため、pubs.Types.ttの下にある、jobs.csというファイルを見てみましょう。
コード自体は以下のようになっています。
|
using System; using System.Collections.Generic;
namespace ConsoleApplication1 { public partial class jobs { #region Primitive Properties public short job_id { get; set; } public string job_desc { get; set; } public byte min_lvl { get; set; } public byte max_lvl { get; set; }
#endregion } } |
EntitFramework POCO Code Generatorを使えば、上記のような簡単な手順でPOCOでEntityを構築することが可能です。
■手順3
以下をコーディングしてテストする。
|
static void Main(string[] args) { using (pubsEntities db = new pubsEntities()) { var query = from j in db.jobs where j.max_lvl > 15 select j; foreach (var q in query) { Console.WriteLine(q.job_desc); } } Console.ReadLine(); } |
これでデータの取得が可能になりました。
さて、こうした手順をベースに次回こそ(すみません・・・)Persistence Ignorance実装をご紹介します。
すみません御報告が遅くなりました。TechEdと先日のTechFildersセミナー(9/18)のフォローです。
TechEdでは、Visual Studio 2010が不慮の事故で落ちてしまい中途半端になってしまった箇所です。
9/18では時間が足りなく、「続きはブログで」と言ったら、アンケートでお叱りを受けましたので、次回からはセッションに絶対納めるようにします、申し訳ありませんでした。
シナリオ.~ 汎用性を考慮するには? ~
この方向性としては、Persistence Ignorance をシステムアーキテクチャとして取り入れてみることを考えてみたいと思います。
Persistence Ignorance とはデータの永続化に対して、特定のテクノロジーやプロダクトに依存しないことをさしています。
詳細はこちらから
http://msdn.microsoft.com/ja-jp/library/dd456853(VS.100).aspx
井上のブログでも紹介しています
http://blogs.msdn.com/daisukei/archive/2009/06/02/visual-studio-2010-ef4-poco-part1.aspx
Persistence Ignoranceの想定される使用シナリオとして代表的なものは、以下のスライドにある記述などがあげられます。
例えば、システム設計として、ModelFirstで考える場合、当然生成物は一般的なクラス(図)になるでしょうから、PIシナリオが適していると言えます。
しかし、ModelFirstは手段であり目的ではありません。なぜModelFirstを行うか?になると別の話題になってきますので、今回は、まず身近な目的で考えて見ましょう、例えばEFでサポートされないデータストアの使用を、将来的に実装したいなどが考えられるのではないでしょうか?
と言うことで、セッションでは、ストアとしてXMLとMS-AccessのMDBファイルを使用して、PIシナリオとして、これらを切り替えてみました。(TechEdでは、その最中にVSが落ちたわけですが・・・)
PIを実現するためには、エンティティが特定のプロダクトやテクノロジーに依存しないことが条件になります。しかし、現状のADO.NET EntityFrameworkでは、エンティティの実装(EDM)として、どうしても特定インタフェースを継承しなければなりません。
この話はよくしますが、確認方法としては、前々回でもご紹介した以下のツールを使用して、手動でEFを使用した環境を構築します。
EDM ジェネレータ (EdmGen.exe)
http://msdn.microsoft.com/ja-jp/library/bb387165.aspx
具体例は以下が分かりやすいかと思います。
Entity Framework プロジェクトを手動で構成する方法
http://msdn.microsoft.com/ja-jp/library/bb738546.aspx
ここで作成した、CSDL、SSDL、MSL、CS(VB)のコードを用いて環境を作成します。(下図)

さて、上記のCS(VB)のコードファイルをダイエットしていくと、最終的に以下のようなコードと向き合うことになります。(例はNorthwindデータベースのProductsエンティティです)
|
[EdmEntityTypeAttribute(NamespaceName = "NorthwindModel", Name = "Products")] public partial class Products : IEntityWithChangeTracker ,IEntityWithKey , IEntityWithRelationships {
[EdmScalarPropertyAttribute(EntityKeyProperty = true, IsNullable = false)] public int ProductID { get; set; }
[EdmScalarPropertyAttribute()] public string ProductName { get; set; }
[EdmScalarPropertyAttribute()] public System.Nullable<int> SupplierID { get; set; }
~後略 |
現バージョンのEFのエンティティとして使用するためには、上記のコードにある、IEntityWithChangeTracker ,IEntityWithKey , IEntityWithRelationships あたりが必要になってくると言うわけです。(エンティティに実装する機能によって必要なインタフェースが変わります)
そこで、こうした記述を排除する方向でPOCO(Plain Old CLR Objects)でのクラスを実装することがPIでは必要になります。
上述した井上のサイトでも、EFの次バージョンを使用したPOCOクラスの実装を紹介していますが、小高は、以前ご紹介したEFのCTPを用いてデモを行っています。
ちょっと長くなってきました(前回が長すぎました・・・)ので、次回の記事でデモを簡単にご紹介したいと思います。
同僚のエバンジェリスト鈴木章太郎が監修した書籍を紹介します。
Silverlightで開発するデータ駆動アプリケーション
価格:¥ 3,570

Silverlightでアプリケーションを開発する場合、データをどのように取得するかは大きな命題です。
Silverlightで作るものが、データの扱いが無い、単なる表示用のパーツならば、古(いにしえ)のJavaアプレットと大きな違いはないわけで、.NET Frameworkでの開発が出来るところが最大のメリットなのですから、それを活用しないことにはSilverlightの魅力が伝わりませんよね。
と言いながら、今までこれと言ってまとまった情報がなかったのが実情かと思います。
このブログでも、今後こうしたSilverlightをきちんと業務のアプリケーションで使うためには?という命題について書いていきたいと思っています。
TechEdのキーノートで、
弊社の大場(↓)

もご紹介しましたが、
マイクロソフトでは、Winsows7アプリケーション開発の支援をしたいと考えています。
Windows7アプリケーション開発を支援します
http://www.microsoft.com/japan/powerpro/developer/default.mspx
最終的には開発ポータルとしてはMSDN Windowsデベロッパーセンターになるはずですが、
上記のページは、その前のはじめの一歩としてご確認いただければと思います。
Windows7は、今後も多くの情報や活動をおこなっていきますので、どうぞご確認ください。
9/18に開催されるTech Fielders セミナー 東京 [.NET 開発テクノロジーの全体像]がめでたく満席になりました。
http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032423184&Culture=ja-JP
その後も何人の方からキャンセル待ちのお話をいただいています。
とは言えキャンセル待ちは不確定なものですけが、裏技をコソっと。
実は、ライトニングトークの登壇者は普通にセミナー参加が可能だったりします。
どうしてもとお考えの方、いかがでしょうか?
こちらも締め切りは9/4だったりしますので、迷っている方がいたら直接メールで相談も可能ですよー(ブログからメール可能です)
シナリオ2.~ より素早く、より効率よく を 考えてみる ~
この方向性で.NET RIA Servicesをご紹介します。
N層アプリケーション開発で難儀な点を書き出せば限がありません。
しかしその要因は全て、「層が分離されている点」に集約されることは賛同いただけるでしょうか?
例えば、データのトランスファ、バリデーション、ビジネスロジック、チェンジトラッキング・・・こうした問題は、古き良きクライアント・サーバー開発では、表面化されてこなかったものです。(もちろん問題がなかったわけではありません。)
そして、汎用化のために様々なテクノロジーやアーキテクチャが生まれてきましたが、これは開発の複雑さを増す要因でもあったわけです。
そこで、こうした考え方の解決として、ADO.NET Data Servicesは、リソースベースの考え方+LINQを用いました。
一方.NET RIA Servicesは、開発環境から見直しを図ります。
.NET RIA Servicesは調べれば多くの情報があるわけですが、ちょっと難解な書き方が多く本質がぼやけるような気がきますので、一番コアとなっている部分を最初にお話ししますね。
ポイントは、
「クライアントのビルドを行うと、サーバー側のロジック・エンティティが、クライアントに射影される」
クライアント(UI)サイドでは、射影されたロジックや型を使ってデータ処理を行うため、あたかもデータが近くにあるかのように開発を進めることが可能になります。
では、これをベースに、初めての.NET RIA Services を見てみましょう。
■開発環境
以下をインストールします。
VS2008(Expressも可)英語版: (注意)現状は英語版のみになります。
Microsoft .NET RIA Services July 2009 Preview
http://www.microsoft.com/downloads/details.aspx?FamilyID=76bb3a07-3846-4564-b0c3-27972bcaabce&displaylang=en
Microsoft® Silverlight™ 3 Tools for Visual Studio 2008 SP1
http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=9442b0f2-7465-417a-88f3-5e7b5409e9dd
■手順1
Silverlight Business Applicationを新規作成します。(Name:Demo)
(別にSilverlight Business Application限定ではありません、何でもOKです。)

■手順2
DemoとDemo.Webと2つのプロジェクトが出来ていますので、Demo.WebでAddNewItem
EDMを追加します。(pubs.edmx)

とりあえず、employeeテーブルを追加→Finish

Demo.Webをビルド(これ忘れると次に支障がでます)
■手順3
Demo.WebでAddNewItem、Domain Service Classを追加します。(pubsService.cs)

以下のダイアログが表示されるので、図のとおりにチェックを入れOKを押します。

すると、pubsService.csが作成され、何やらCRUDっぽい関数が作成されているのがわかります。
これらはクライアントに射影されます。

これでサーバー側は終了です。
■手順4
Demoプロジェクト(クライアント側)でビルドします。
ShowAllFilesを押すとDemo.Web.g.csが表示されます。
これがクライアントに射影されたサーバー側のロジック&型になります。

■手順5
DemoプロジェクトでAddNewItem、Silverlightページを追加します(Employee.xaml)

■手順6
Employee.xamlにDataGridを追加(Boldの部分)
Employee.xamlをViewsフォルダに移動

■手順7
MainPage.xamlに以下を追記(Bolodの部分)
|
<StackPanel x:Name="LinksStackPanel" Style='{StaticResource LinksStackPanelStyle}'>
<HyperlinkButton x:Name="Link1" Style='{StaticResource LinkStyle}' NavigateUri="/Home" TargetName="ContentFrame" Content="home"/>
<Rectangle x:Name="Divider1" Style='{StaticResource DividerStyle}'/>
<HyperlinkButton x:Name="Link2" Style='{StaticResource LinkStyle}' NavigateUri="/About" TargetName="ContentFrame" Content="about"/>
<HyperlinkButton x:Name="Link3" Style='{StaticResource LinkStyle}' NavigateUri="/Employee" TargetName="ContentFrame" Content="社員リスト"/>
</StackPanel> |
■手順8
Employee.xaml.csに以下を追記(Bolodの部分)
|
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using System.Windows.Navigation; using Demo.Web; using System.Windows.Ria.Data;
namespace Demo { public partial class Employee : Page { pubsContext db = new pubsContext();
public Employee() { InitializeComponent(); this.dataGrid1.ItemsSource = db.employees; EntityQuery<employee> query= db.GetEmployeeQuery(); db.Load(query); } |
■手順9
実行します、社員リストを選択すると以下の画面が表示されるはずです。

ポイントとなるのは、手順3でサーバー側に作成されたpubsService.csが、手順4でクライアントに射影されており、手順8でクライアントから使用しているところです。
以下の記述は、pubsService.csに定義されたGetEmployeeからクライアントに作られたものです。
db.GetEmployeeQuery();
したがって、サーバー側のGetEmployeeに引数などを入れてしまえば、クライアントでも引数を要求しますし、ロジックを変更すれば、クライアントから実行した場合に相当の結果になります。
このサーバーとクライアントの射影は、名前か、あるいはサーバー側に属性をつけることによって、実行されます。(Update~のような名前にすると更新系と判断されます)
こうした詳細なルールや、CRUDの実装など、あるいはチェンジトラッキング、トランザクションなど、データ処理の気になる部分は以下をご覧ください。
.NET RIA Servicesの概要
http://msdn.microsoft.com/ja-jp/silverlight/dd920272.aspx
鈴木章太郎ブログ
http://blogs.msdn.com/shosuz/
.NET RIA Servicesは現在Silverlightが主だったターゲットですが、最終的には様々なUIテクノロジーに対応することになっています。
9/18にTech Fielders セミナー 東京 [.NET 開発テクノロジーの全体像]が開催されます。
http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032423184&Culture=ja-JP
左に見える本「.NET 開発テクノロジー入門」の著者が講師となってセッションをお話いたします。
小高は井上さんと協力してEFについてお話しようかと思います。
井上さんが基本的なところ、小高はPOCOっぽいところでもう少し大きなストーリーをお話する予定です。
また、このセミナーではライトニングトークも行われますので、もしご興味があれば、是非お申込みください。(間違いなく、この本は景品になるはずです!)
テクノロジーと全く関係ないネタでも歓迎ですよー。
ちなみに、ライトニングトーク司会は、この本の発起人であるエバンジェリスト松崎です。松崎が司会をするのはTechEdのヒーローラウンジ以来だと思います。
どうぞお楽しみに。
TechEdのAsk The Speaker(Q&A)の出来事です。
そこに来てくれた方(2名)は当初、ADO.NET Entity Frameworkのトレードオフについての質問をしに来てくれたのですが、色々とその場でディスカッションさせていただき、最後には「技術を理解して正しく運用しなければ、期待した成果はでない」というところに集約してお互いに納得したのです。
全てを満足する技術は当然ながらないわけで、そのためには、正しく理解することが必要です。EFであれば、データストアを抽象化して開発効率を上げる代わりに、データストアに直結したチューニングなどは難しい面があります。
そうしたことを理解したうえでのフォードバックは本当に身になりますし個人的にも癒されます。
自分のような職種であると、MSのあれがダメ、これがダメというお話を聞くことも多く、それは真摯に受け止めなければなりませんが・・・
と皆まで書こうと思ったのですが、なにやらSQL Server製品チームの北川が、似たような主旨で記事を書いています。
「中堅企業向け オラクル都市伝説シーズン2: 其の一」への反論 http://blogs.technet.com/sqlpm-j/archive/2009/08/27/3277427.aspx
このオラクル都市伝説は明記はしていませんが、明らかにSQL Serverのことを対象にしているように思います。もちろんSQL Serverを正しく運用している方からみれば、どこから反論してよいかという内容なのですが、これは個人の問題を超えてしまっているわけで・・・
他社はともかく、少なくとも弊社サイドでは、正しい情報をわかりやすく、そしてフェアに伝えていかなければならないですね。
引き続きセッションフォローです。
シナリオ2.~ より素早く、より効率よく を 考えてみる ~
汎用性を多少犠牲にしても開発効率をあげる方向性で考えてみます。
ここでは、EFに加えてADO.NET Data Servicesと.NET RIA Serviceを使用します。
どちらも、N層の開発を簡素化することが大きなメリットになっています。
今回、DataServicesについては、Astoria Offlineをご紹介しました。
こちらに関しては、以前ご紹介しています。
http://blogs.msdn.com/tarok/archive/2009/01/30/9384583.aspx
(現在AlphaPreviewなのですが、コードなどに全く相違はありません。)
セッションのビデオも公開されています。http://www.microsoft.com/japan/powerpro/techdays/searchresult.aspx?SessionID=T3-305
特にAstoria Offlineは、オフライン対応が目的なのですが、簡易N層アプリケーション開発を可能にするテクノロジーとしての側面も十分に備えています。クライアントにあるデータソースは、クライアントのデータ操作をトラックして、あたかもUnit of Workのように働くことが可能です。開発においても、データ操作はクライアントのみで考えればよいため非常に明快です。
例えば、今回のデモではExcelをクライアントとして使用したのですが、データの取得は以下のように行いました。
|
ExcelWorkbook1.ExpensesDbEntities db; public void LoadData() { db = new ExcelWorkbook1.ExpensesDbEntities(); var query = from ex in db.Expense orderby ex.CreatedDate descending select ex; Globals.Sheet1.expenseBindingSource.DataSource = query; } |
上記の変数dbはクライアントにあるEDMに対してのDataContextになります。
さらに保存処理は以下になります。
private void button2_Click(object sender, RibbonControlEventArgs e) { //保存ボタン押下 db.SaveChanges(); } |
これだけですが、データの追加、更新、削除を賄います。
Excelですので、データの記述自体も非常に単純です(コピーペーストが可能)
そして、同期処理は今回リボンのボタンに実装しましたが、以下のようになります。
|
private void button1_Click(object sender, RibbonControlEventArgs e) { //同期ボタン押下 var dsp = new DataServiceSyncProvider( new Uri("http://localhost:8076/Expenses.svc"), "global");
var esp = new ObjectContextSyncProvider( () => new ExcelWorkbook1.ExpensesDbEntities()); var so = new SyncOrchestrator(); so.RemoteProvider = dsp; so.LocalProvider = esp; so.Direction = SyncDirectionOrder.UploadAndDownload;
try { so.Synchronize(); System.Windows.Forms.MessageBox.Show("同期完了!"); } catch (Exception ex) { System.Windows.Forms.MessageBox.Show(ex.Message); } LoadData(); } |
デモファイルをこちらに置いておきます。
DB作成のスクリプトも同梱していますが、接続文字だけ確認してください。
Astoria Offlineについては以下から入手できます。http://blogs.msdn.com/tarok/archive/2009/03/10/9468628.aspx
長くなってきましたので、.NET RIA Serviceについては別の機会にご紹介したいと思います。
TechEdが無事終了しました。
まずはADO.NET Entity Framework開発セッションで行ったデモをご紹介します。
このセッションはADO.NET Entity Frameworkを多層階層ソリューションで用いるための3つのシナリオでご紹介しました。このブログを通じて、ひとつづつご紹介していきます。
シナリオ1.~ 素直に ADO.NET Entity Framework を使用してみる ~
ドメインモデルとして、そのままEDMを使用するパターンです。

この場合、ビジネス層のメリットはEFのサービスが受けられること、デメリットはシステム全体がEFと密になってしまうことです。
次にサービスレイヤーとしてのメリットは、EDMをVSで作成すると、DataContract属性がついた形でコードがジェネレートされますので、また、DTOを意識せずに、そのままEDMを公開可能です。したがって、とくに工夫しなければ、この形でシステムを構築することになるでしょう。
(2009/9/2変更)デメリットは、DataContextはDataSetのように初めからDTOとして設計されていないため、WCFなどでシリアル化してしまい、一度切り離してしまうと、チェンジトラッキングを行わない問題があります。(通常の使用ではObjectStateManagerが行っています。)
このためEFを使用した多層ソリューションは参照系がメインとなるといわれるのです。http://msdn.microsoft.com/ja-jp/data/dd919159.aspx
最後にデータ層としては、プロバイダの対応があれば、どのようなデータストアも対応が可能であり、変更してもアプリケーションの変更は基本的にないはずです。
ここを説明するために、今回はMySQLにデータストアを変更してみました。
MySQL5.1 Community Server
http://dev.mysql.com/downloads/mysql/5.1.html
使用したプロバイダは以下です(フリーです)http://dev.mysql.com/downloads/connector/net/6.0.html
ツールも使用しました
MySQL GUI Tool
http://dev.mysql.com/downloads/gui-tools/5.0.html
MySQL側にもNorthwindと同じデータベースを作成して、切り替えデモに備えたわけです。
データストア変更の手順ですが、デモで行ったのは接続文字列を変更しただけです。
・SQLServer用
<add name="NorthwindEntities" connectionString="metadata=.\Demo.DAL\Northwind.csdl|.\Demo.DAL\Northwind.ssdl|.\Demo.DAL\Northwind.msl;provider=System.Data.SqlClient;provider connection string="Data Source=.;Initial Catalog=Northwind;Persist Security Info=True;User ID=XX;Password=XX;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
・MySQL用
<add name="NorthwindEntities" connectionString="metadata=.\Demo.DAL\Northwind.csdl|.\Demo.DAL\Northwind_MySQL.ssdl|.\Demo.DAL\Northwind.msl;provider=MySql.Data.MySqlClient;provider connection string="server=localhost;user id=XX;password=XX;persist security info=True;port=3307;database=northwind"" providerName="System.Data.EntityClient" />
SSDLのアドレスが異なることに注目してください。ストアスキーマは当然ながらそれぞれ対応しなければなりません。以下に示します。(Productsテーブルのみを使用)型が異なることなど、当然ながらDBごとの相違点があります・
・SQLServer用 <?xml version="1.0" encoding="utf-8" ?> <Schema Namespace="NorthwindModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2006/04/edm/ssdl"> <EntityContainer Name="NorthwindModelStoreContainer"> <EntitySet Name="Products" EntityType="NorthwindModel.Store.Products" store:Type="Tables" Schema="dbo" /> </EntityContainer> <EntityType Name="Products"> <Key> <PropertyRef Name="ProductID" /> </Key> <Property Name="ProductID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" /> <Property Name="ProductName" Type="nvarchar" Nullable="false" MaxLength="40" /> <Property Name="SupplierID" Type="int" /> <Property Name="CategoryID" Type="int" /> <Property Name="QuantityPerUnit" Type="nvarchar" MaxLength="20" /> <Property Name="UnitPrice" Type="money" /> <Property Name="UnitsInStock" Type="smallint" /> <Property Name="UnitsOnOrder" Type="smallint" /> <Property Name="ReorderLevel" Type="smallint" /> <Property Name="Discontinued" Type="int" Nullable="false" /> </EntityType> </Schema> |
・MySQL用 <?xml version="1.0" encoding="utf-8" ?> <Schema Namespace="NorthwindModel.Store" Alias="Self" Provider="MySql.Data.MySqlClient" ProviderManifestToken="5.1" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2006/04/edm/ssdl"> <EntityContainer Name="NorthwindModelStoreContainer"> <EntitySet Name="Products" EntityType="NorthwindModel.Store.products" store:Type="Tables" Schema="northwind" /> </EntityContainer> <EntityType Name="products"> <Key> <PropertyRef Name="ProductID" /> </Key> <Property Name="CategoryID" Type="int" /> <Property Name="Discontinued" Type="int" Nullable="false" /> <Property Name="ProductID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" /> <Property Name="ProductName" Type="varchar" Nullable="false" MaxLength="40" /> <Property Name="QuantityPerUnit" Type="varchar" MaxLength="20" /> <Property Name="ReorderLevel" Type="smallint" /> <Property Name="SupplierID" Type="int" /> <Property Name="UnitPrice" Type="decimal" Precision="19" Scale="4" /> <Property Name="UnitsInStock" Type="smallint" /> <Property Name="UnitsOnOrder" Type="smallint" /> </EntityType> </Schema> |
MySQLとSQLServerに関しての移行情報は以下を参照してみてください。ちょっと古い情報ですが、基本的には変わりないはずです。
MySQL から Microsoft SQL Server 2000 への移行
http://technet.microsoft.com/ja-jp/library/cc997732.aspx
さて、普段EDMをVSから.edmxとして追加していると、上記のようにSSDLのみを変更する手順に悩むかもしれません。
これに関してはEDMGen.exeを使用して別途作成して、VSプロジェクトに取り込みます。
EDM ジェネレータ (EdmGen.exe)
http://msdn.microsoft.com/ja-jp/library/bb387165.aspx
こちらのデモは以下にホストします。DBの作成や接続文字を調整する必要がありますのでご注意ください。
これも少し前なのですが(こればっかりです、すみません)
Entity Framework Feature CTP 1がリリースされています。
http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=7fd7164e-9e73-43f7-90ab-5b2bf2577ac9
ポイントをば。
・.NET Framework 4.0 Beta 1.用CTP
・.NET Framework 4.0には含まれない予定
・みなさんからのフィードバックで別CTPも予定
・なにか見つけたら、Microsoft Connectにお願い
・フォーラムはここ(Entity Framework 4.0 Beta.)
実装される機能は以下
1) Better N-Tier Support with Self Tracking Entities
おぉ、ようやくですね。変更セットのひきまわしが可能と。
2) POCO (Plain Old CLR Objects) entity code generation via the POCO Template
EDMからPOCOのエンティティを作ってくれる機能ですね。モデルファーストというかDDDを促進というか。詳しくはリンクへどうぞ(英語ですが)
3) Writing only code and having it work with the Entity Framework via Code Only.
コードのみでEntityFrameworkを成立させる機能です。色々制約はありますね、(SQLServerのみ、Mapping非サポートなど)これはかなり様子見です。
というわけで、これはTechEdで紹介したいのですが、小高セッションでは難しいかな~井上さんのシアターセッションでは紹介あるはずです。
.NET開発テクノロジ入門ですが、ようやく手元に届きました。
思ったよりもかなり薄い本ですね~。これなら電車でも読めると思います。
著者の皆さんが苦労してページ圧縮に励んだかいがありました。
と言いながら、小高担当章が一番ページ数がありますが・・・
この本の出版に伴いまして、TechEdのIT Hero Loungeで、著者と方ろう!トークイベントが行われます。
http://www.microsoft.com/japan/teched/2009/connect/ithero.mspx
最新刊「.NET 開発テクノロジ入門 ~.NET の基礎からクラウド テクノロジ Windows Azure まで~」の著者が来場し、書籍に込めた思いや書ききれなかった情報などについて熱く語ります。
車座形式で著者を身近に感じながらカジュアルなトークをお楽しみいただけます。また著者に直接ご質問いただける時間もありますので、ぜひお集まりください。
カジュアルトークと書いてありますが、クイズやこぼれ話などをやるようです。(松崎師匠がそのような事を言っていました・・・)
また、上記のリンクには日程が書いてないですが、3日目(8/28)のランチタイムに開催されます。
残念ながら、小高は自分のセッションの準備時間と重なるため、おそらく参加はできないと思いますが、TechEdに参加される皆様はぜひ足をお運びください。