VisualStudioでMySQLにコードファーストで接続してみる


# 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)](https://dev.mysql.com/downloads/connector/net/) を左記リンクからダウンロードし、インストールを行います。
- Downloadボタンを押下します。
![WS000093.JPG](https://qiita-image-store.s3.amazonaws.com/0/90597/85e10810-02d6-af1d-0a99-8671b4deea65.jpeg)

- 既にアカウントを持っているのであれば、Loginボタンを押下します。
  - MySQLのサイトからのダウンロードは、アカウント持っていない場合は、Sign Upからアカウント作成する必要があります。
![WS000094.JPG](https://qiita-image-store.s3.amazonaws.com/0/90597/4f2a822a-fc7d-6588-0a25-0dbc0d7686c2.jpeg)

- ログイン後、DownLoad Nowボタンを押下します。
- 「mysql-connector-net-6.9.9.msi」を実行します。
-  Nextボタンを押下します。
![WS000097.JPG](https://qiita-image-store.s3.amazonaws.com/0/90597/afc26220-90d3-f5a5-d71d-69176337507e.jpeg)

- Typicalボタンを押下します。
![WS000098.JPG](https://qiita-image-store.s3.amazonaws.com/0/90597/d738f029-39af-811d-57fb-90a3ed31c9b2.jpeg)

- Instrallボタンを押下します。
![WS000099.JPG](https://qiita-image-store.s3.amazonaws.com/0/90597/5f92adca-7bc3-1515-6e5e-7717bbaf06c8.jpeg)

- Finishボタンを押下します。
![WS000100.JPG](https://qiita-image-store.s3.amazonaws.com/0/90597/9e525352-7742-1a6e-fc46-06a7e563593b.jpeg)

### MySQL for Visual Studio

- [MySQL for Visual Studio](https://dev.mysql.com/downloads/windows/visualstudio/) を左記リンクからダウンロードし、インストールを行います。
- Downloadボタンを押下します。
![WS000102.JPG](https://qiita-image-store.s3.amazonaws.com/0/90597/7ec16cae-b343-25a4-e4d1-a66a8b88cc3a.jpeg)

- 「mysql-for-visualstudio-1.2.7.msi」を実行します。
-  Nextボタンを押下します。
![WS000103.JPG](https://qiita-image-store.s3.amazonaws.com/0/90597/8d92ed9c-970b-f8a3-117b-e4a458993dd1.jpeg)

- Typicalボタンを押下します。
![WS000104.JPG](https://qiita-image-store.s3.amazonaws.com/0/90597/a1e9b112-901e-f804-bd7e-39bf35740193.jpeg)

- Instrallボタンを押下します。
![WS000105.JPG](https://qiita-image-store.s3.amazonaws.com/0/90597/56ebc4c6-2bb9-daad-95f2-6146453be721.jpeg)

- Finishボタンを押下します。
![WS000106.JPG](https://qiita-image-store.s3.amazonaws.com/0/90597/dde4ea95-66c9-f788-f2d6-b65d34ac37e7.jpeg)


## クラスアプリケーションの作成

### ソリューションの作成
- クラス ライブラリ(.NET Framework)を選択し、名前を付けます。
![WS000107.JPG](https://qiita-image-store.s3.amazonaws.com/0/90597/68fdc746-d484-76f2-85e3-cbbe83b8c443.jpeg)

### NuGetのインストール

- 参照 右クリック > NuGetパッケージ 管理 から以下をインストール
 - EntityFramework
 - MySql.Data
 - MySql.Data.Entity
![WS000108.JPG](https://qiita-image-store.s3.amazonaws.com/0/90597/bb820037-ada3-d2fa-4dab-c539e7a7063c.jpeg)

### Modelsフォルダの作成

- プロジェクトを右クリック > 追加 > 新しいフォルダー を選択
- 「Models」を指定します。

### EntityDataModelの作成

- 「Models」フォルダを右クリック > 追加 > 新しい項目 を選択
- データ > ADO.NET Entity Data Model を選択し、名前を指定し、追加
 - 今回は、「MySQLEntities」としています。
 - もし、途中でエラーになった場合は、下の方の手順のApp.configの編集を先に行ってください。
 
![WS000109.JPG](https://qiita-image-store.s3.amazonaws.com/0/90597/b3df7418-2673-ed5b-9121-5d31ea10a7cf.jpeg)

- 「データベースからCode first」を選択 > 次へ
![WS000110.JPG](https://qiita-image-store.s3.amazonaws.com/0/90597/e7fb2c89-e7cf-3978-2069-e0c881768234.jpeg)

- 新しい接続ボタンを押下します。
![WS000111.JPG](https://qiita-image-store.s3.amazonaws.com/0/90597/4e806dcf-d8ec-0bf8-7ad5-0161e2c8cd9c.jpeg)

- データソースは、「MySQL Database」を選択 > 続行
![WS000112.JPG](https://qiita-image-store.s3.amazonaws.com/0/90597/6d15a341-5cb6-6236-3e95-63199db97867.jpeg)

- 各接続情報を入力 > OK
![WS000113.JPG](https://qiita-image-store.s3.amazonaws.com/0/90597/333b811e-b234-1dc9-3fb3-3713268ec5bb.jpeg)
![WS000114.JPG](https://qiita-image-store.s3.amazonaws.com/0/90597/39519b22-78cd-ca51-235b-37fef72ce063.jpeg)

- 「はい、重要情報接続文字列に含めます。」を選択、「App.Configに保存」にチェックし、次へ
![WS000115.JPG](https://qiita-image-store.s3.amazonaws.com/0/90597/791c5d88-de85-c657-fefb-42c094fe540b.jpeg)

- 必要テーブルにチェックを入れる > 完了
![WS000116.JPG](https://qiita-image-store.s3.amazonaws.com/0/90597/c4f82813-6a45-d418-e153-3bcede81c5c7.jpeg)

正しく登録できていれば、上記のようにテーブルやビューが選択できるようになります。

>　追記（2021/01/12）
― 上の画面が出てこない場合は、App.configを一部修正が必要

```xml: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`から後ろを削除

```xml: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"></provider>
    </providers>
  </entityFramework>
```

### App.configの編集
- 上記までの手順でできそうなのですが、エラーが発生する場合があるので、App.configに手を入れます。
- 条件によっては、最初から記述済みの可能性があります。

```xml: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: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  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](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つ目の方式を採用しています。