TechEdフォロー(T2-405:ADO.NET Entity Framework Part1)

TechEdが無事終了しました。

まずはADO.NET Entity Framework開発セッションで行ったデモをご紹介します。

このセッションはADO.NET Entity Frameworkを多層階層ソリューションで用いるための3つのシナリオでご紹介しました。このブログを通じて、ひとつづつご紹介していきます。

シナリオ1.~ 素直に ADO.NET Entity Framework を使用してみる ~

ドメインモデルとして、そのままEDMを使用するパターンです。

image

この場合、ビジネス層のメリットは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=&quot;Data Source=.;Initial Catalog=Northwind;Persist Security Info=True;User ID=XX;Password=XX;MultipleActiveResultSets=True&quot;" 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=&quot;server=localhost;user id=XX;password=XX;persist security info=True;port=3307;database=northwind&quot;" 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の作成や接続文字を調整する必要がありますのでご注意ください。