VisualStudioでMySQLにコードファーストで接続してみる
開発環境
- Visual Studio 2017 (C#)
- EntityFramework 6.1.3
- MySql.Data.Entity
- MySql.Data.Entity 6.9.9
- MySql.Data 6.9.9
- Connector/Net (ADO.NET driver for MySQL) 6.9.9
- MySQL for Visual Studio 1.2.7
初めに
ちょっと前までは、NuGetから「MySql.ConnectorNET.Data」と「MySql.ConnectorNET.Entity」をインストールして使用していましたが、今ではNuGetからどうやら取得できないようなので、VisualStudioからコードファーストでモデルを作成し、クラスアプリケーションとしてdllファイルを作成する場合の手順となります。
インストール
Connector/Net (ADO.NET driver for MySQL)
-
Connector/Net (ADO.NET driver for MySQL) を左記リンクからダウンロードし、インストールを行います。
-
既にアカウントを持っているのであれば、Loginボタンを押下します。
-
ログイン後、DownLoad Nowボタンを押下します。
-
「mysql-connector-net-6.9.9.msi」を実行します。
MySQL for Visual Studio
-
MySQL for Visual Studio を左記リンクからダウンロードし、インストールを行います。
-
「mysql-for-visualstudio-1.2.7.msi」を実行します。
クラスアプリケーションの作成
ソリューションの作成
NuGetのインストール
Modelsフォルダの作成
- プロジェクトを右クリック > 追加 > 新しいフォルダー を選択
- 「Models」を指定します。
EntityDataModelの作成
- 「Models」フォルダを右クリック > 追加 > 新しい項目 を選択
- データ > ADO.NET Entity Data Model を選択し、名前を指定し、追加
- 今回は、「MySQLEntities」としています。
- もし、途中でエラーになった場合は、下の方の手順のApp.configの編集を先に行ってください。
正しく登録できていれば、上記のようにテーブルやビューが選択できるようになります。
追記(2021/01/12)
― 上の画面が出てこない場合は、App.configを一部修正が必要
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider>
</providers>
</entityFramework>
-
version
から後ろを削除
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6"></provider>
</providers>
</entityFramework>
App.configの編集
- 上記までの手順でできそうなのですが、エラーが発生する場合があるので、App.configに手を入れます。
- 条件によっては、最初から記述済みの可能性があります。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider>
</providers>
</entityFramework>
<connectionStrings>
<add name="MySQLEntities" connectionString="server=*****;user id==*****;password==*****;port=****;persistsecurityinfo=True;database=cb_cbgrn" providerName="MySql.Data.MySqlClient" />
</connectionStrings>
</configuration>
-
<system.data>
タグから</system.data>
タグを追加します。 -
entityFramework
タグ内にcodeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6"
を追加
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6">
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
<provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider>
</providers>
</entityFramework>
<system.data>
<DbProviderFactories>
<remove invariant="MySql.Data.MySqlClient" />
<add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
</DbProviderFactories>
</system.data>
<connectionStrings>
<add name="MySQLEntities" connectionString="server=*****;user id==*****;password==*****;port=****;persistsecurityinfo=True;database=cb_cbgrn" providerName="MySql.Data.MySqlClient" />
</connectionStrings>
</configuration>
リビルド
- リビルド後、プロジェクト名のdllファイルが生成されているので、任意のWebAPIのサービスなどで参照することで、使用できるようになります。
まとめ
一旦、entitiesに入れてしまえば、MySQLとSQL ServerとのリレーションもLINQで行えるので、SQLServer上にMySQLのリンクサーバ立てるより、こちらの方法をとってWebサービス側のリポジトリでLINQで接続する方法が良いと思いました。
補足情報
- 公式のサイトでは、3つの方法でDbConfigrationを指定しているようです。
- https://dev.mysql.com/doc/connector-net/en/connector-net-entityframework60.html
8.2 Entity Framework 6 Support
Set the new DbConfiguration class for MySql. This step is optional but highly recommended, because it adds all the dependency resolvers for MySql classes. This can be done in three ways:
なので、今回は、3つ目の方式を採用しています。