質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.13%

MySQL で ADO.NET Entity Data Model を作成

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,889

shun1

score 7

ASP.net MVC5でADO.net Entity DataModelのデータベースからCoad First を使用して
Webアプリを作っていますが、ウィザードの途中でウィザードが終了してしまい、困っております。
対処法などでアドバイスなどを教えていただけるでしょうか?

•Visual Studio 2017 (C#)
•MySQL Server 8.0.12
•EntityFramework 6.2.0
◦MySql.Data 8.0.12
•MySql.Data.Entity 6.10.8
•MySql.Web 8.0.12
•MySQL mysql connector net 8.0.12
•mysql for visualstudio 1.2.8

■やったこと

VisualStudioのサーバーエクスプローラーから、データ接続>OK 

同じく、テーブルのデータ取得>OK

■Web.conigの中身
<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.10.8.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d">
</provider></providers>
</entityFramework>
<connectionStrings>
<add name="TestModel" connectionString="data source=(LocalDb)\MSSQLLocalDB;initial catalog=WebApp.Models.TestModel;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
<remove name="LocalMySqlServer" /><add connectionString="" name="LocalMySqlServer" providerName="MySql.Data.MySqlClient" /></connectionStrings>

MVCのフレームワークを使用して環境設定をしているところですが、EntityDataModelの作成をしようとしています。
■手順
・プロジェクト内になる「Models」フォルダを右クリック > 追加 > 新しい項目 を選択
・Data > ADO.NET Entity Data Model を選択し、名前を指定し、追加 
今回は、「DBModel」としています。
•Entity Data Modelウィザード「データベースからCode first」を選択 > 次へ
•新しい接続ボタンを押下します。
•データソースは、「MySQL Database」を選択 > 続行
•各接続情報を入力 > OK
(テスト接続は成功しました。)
•「はい、重要情報接続文字列に含めます。」を選択、「App.Configに保存」にチェックし、次へ

次の画面「データ接続の選択」画面で
ラジオボタン項目「Entity Framework 6.X」が一瞬表示されますが、エラーメッセージも表示されずに終了してしまいます。

参考としたサイト
https://qiita.com/HAGITAKO/items/782e447ef11abdcb17cc

よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • SurferOnWww

    2018/10/15 15:50

    いえ、質問者さんのケースで 6.9.8 でなければならないかは分かりません。自分の環境で TableAdapter 構成ウィザードを使うときは MUST だったというのは確かですが。とりあえず今のままで、後で回答欄に書くことを試してみることをお勧めします。

    キャンセル

  • shun1

    2018/10/15 15:53

    ありがとうございます。回答お待ちしております。

    キャンセル

  • shun1

    2018/10/16 13:36

    SurferOnWwwさんのご協力のおかげで、とりあえずウィザードの画面が最後まで表示されました。ただ、生成後にEntityCommandExecutionExceptionが発生するため、別途調査が必要となっています。

    キャンセル

回答 2

check解決した方法

0

下記環境と設定を行ったらウィザードの作成画面が正常に表示されました。
ただ、生成後にEntityCommandExecutionExceptionが発生するため、別途調査が必要となっています。

1.すでに "Connector/NET" と "MySQL for Visual Studio" をインストールしていた場合は、MySQL Installerから削除する。

2."MySQL for Visual Studio" v2.0.5 CTP (MySQL for Visual Studio).をインストールする。
注: Connector/NETよりも先にMySQL for Visual Studioをインストールしてください。
 
3."Connector/NET" v6.9.10 (Connector/Net)をインストールする。

4.Visual Studio Professional 2017 でprojectを新規作成する。

5.Nugetパッケージの管理より"EntityFramework" v6.2.0を検索し、インストールする。

6.ソリューションエクスプローラーの参照を右クリックして参照の追加を選択。ダイアログの参照ボタンを押下してMySql.Data.dllとMySql.Data.Entity.EF6.dllを下記pathより設定する。
C:\Program Files (x86)\MySQL\Connector.NET 6.9.10\Assemblies\v4.5\MySql.Data.dll 
C:\Program Files (x86)\MySQL\Connector.NET 6.9.10\Assemblies\v4.5\MySql.Data.Entity.EF6.dll

7.Web.ConfigのentityFrameworkタグのprovidersに下記タグを追加する。
<entityFramework>
<providers>
<provider invariantName="MySql.Data.MySqlClient"
type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6" />
</providers>
</entityFramework>

8.ソリューションをリビルドする。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

上の私のコメントで「Visual Studio Community 2015 のウィザードのみを使って EF5 ベースで EDM を作成することで良ければ紹介しますが?」と書きましたが、それを以下に書きます。

まず、自分が使っている環境ですが以下の通りです。

・Windows 10 Pro 64-bit
・Visual Studio 2015 Community Update 3
・MySQL Community Server 5.7.17
・MySQL for Visual Studio 1.2.6
・Connector/Net 6.9.8

MySQL 関係はすべて MySQL Installer 5.7.17 でインストールしたものですが、以下の記事に書いてあるように MySql.Data.dll のバージョン不整合の問題があったので Connector/NET を 6.9.9 から 6.9.8 に変更しています。

MySQL での TableAdapter 構成ウィザード不具合
http://surferonwww.info/BlogEngine/post/2018/02/10/tableadapter-configuration-wizard-does-not-work-properly-for-mysql.aspx

まずまっさらな Windows Forms アプリのプロジェクトを Visual Studio のテンプレートを利用して作成します。質問者さんのアプリは ASP.NET MVC とのことですが、Entity Data Model 作成については同じことです。

4.6 Tutorial: Using an Entity Framework Entity as a Windows Forms Data Source
https://dev.mysql.com/doc/connector-net/en/connector-net-tutorials-entity-framework-winform-data-source.html

NuGet で EntityFramework, MySql.Data, MySql.Data.Entity のインストールは行わないことに注意してください。それをやると質問者さんと同じ問題に遭遇すると思います。

操作の過程で EF5 が自動的にインストールされ参照設定に追加されます。MySQL 関係の .dll は、どのようにしているのか未確認ですが、たぶん GAC にインストール済のものを使うように設定されるのではないかと思います(参照設定もされないので他には考えられません)。

チュートリアルに書いてあるデータベース world は MySQL Installer 5.7.17 を使うとインストール済みで使える状態になっています。なければ、チュートリアルに書いてある MySQL Documentation page から入手できるそうです。

チュートリアルの手順に従って進めていくと途中でチュートリアルには書いてない以下の画像の警告が出るかもしれませんが、[次へ(N) >]をクリックして進めてください。

イメージ説明

MySQL Server 5.7.6 以降ではバグ(?)があるそうで、[次へ(N) >]をクリックで以下のエラーが出るかもしれません。

次の例外によりモデルを生成できません: 'System.Data.StrongTypingException: テーブル 'TableDetails' の列 'IsPrimaryKey' の値は DBNull です。 ---> System.InvalidCastException: 指定されたキャストは有効ではありません。

その場合は以下の stackoverflow の記事の回答に従って対処してください。

MySQL - Entity : The value for column 'IsPrimaryKey' in table 'TableDetails' is DBNull
https://stackoverflow.com/questions/33575109/mysql-entity-the-value-for-column-isprimarykey-in-table-tabledetails-is

対処後、再度チュートリアルの「Adding an Entity Data Model」に従って作業すれば完成するはずです。

イメージ説明

ここまで出来たら、一旦ビルドして、EDM を使えるようになるはずです。

例えば、以下のようなコードを書けば、

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsMySqlEdm2
{
    public partial class Form1 : Form
    {
        private DataGridView dataGridView1;
        private BindingSource bindingSource1;
        private worldEntities context;

        public Form1()
        {
            InitializeComponent();

            this.dataGridView1 = new DataGridView();
            this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill;
            this.bindingSource1 = new BindingSource();
            this.dataGridView1.DataSource = this.bindingSource1;
            this.Controls.Add(this.dataGridView1);

            this.context = new worldEntities();

            var data = from c in context.city
                       where c.CountryCode == "JPN"
                       select new SelectedCities
                       {
                           Name = c.Name,
                           District = c.District,
                           Population = c.Population
                       };

            this.bindingSource1.DataSource = data.ToList();
        }
    }

    public class SelectedCities
    {
        public string Name { get; set; }
        public string District { get; set; }
        public int Population { get; set; }
    }
}

以下の結果が得られます。

イメージ説明

ちなみに、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=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
  </startup>
  <connectionStrings>
    <add name="worldEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=MySql.Data.MySqlClient;provider connection string=&quot;server=localhost;user id=root;password=rkt81141;persistsecurityinfo=True;database=world&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
  </entityFramework>
</configuration>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/16 07:16 編集

    一つだけ気がついたことを書きます。
    質問者さんの環境の MySQL for Visual Studio のバージョンは 1.2.7 とのことですが、そうすると上に紹介した自分のケース (1.2.6) とは Visual Studio が使う Connector/NET のバージョンが異なるかもしれません。その辺りを調べてみてはいかがですか?

    キャンセル

  • 2018/10/16 13:58

    ご指摘ありがとうございます。最終的にはMySQL for Visual Studioのバージョンは、結局2.0.5、Connector/NETは6.9.10で実行してみました。他のバージョンで試してみたほうがいいですかね?

    キャンセル

  • 2018/10/16 16:35

    それは自分にはコメントできないです。今のままで EntityCommandExecutionException の問題が解決しなくて結局使えない状況であれば、上のコメントにも書きましたが「MySQL で ADO.NET Entity Data Model を作成」というタイトルにして、ASP.NET ではない C# のアプリの話として、新たに別のスレッドを立てて質問し直した方が良いかもしれません。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.13%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる