Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
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を使用した多層ソリューションは参照系がメインとなるといわれるのです。https://msdn.microsoft.com/ja-jp/data/dd919159.aspx
最後にデータ層としては、プロバイダの対応があれば、どのようなデータストアも対応が可能であり、変更してもアプリケーションの変更は基本的にないはずです。
ここを説明するために、今回はMySQLにデータストアを変更してみました。
MySQL5.1 Community Server
https://dev.mysql.com/downloads/mysql/5.1.html
使用したプロバイダは以下です(フリーです)https://dev.mysql.com/downloads/connector/net/6.0.html
ツールも使用しました
MySQL GUI Tool
https://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="https://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="https://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="https://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="https://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 への移行
https://technet.microsoft.com/ja-jp/library/cc997732.aspx
さて、普段EDMをVSから.edmxとして追加していると、上記のようにSSDLのみを変更する手順に悩むかもしれません。
これに関してはEDMGen.exeを使用して別途作成して、VSプロジェクトに取り込みます。
EDM ジェネレータ (EdmGen.exe)
https://msdn.microsoft.com/ja-jp/library/bb387165.aspx
こちらのデモは以下にホストします。DBの作成や接続文字を調整する必要がありますのでご注意ください。