web-dev-qa-db-ja.com

Entity Framework 4およびコードファースト開発CTPでのMySqlの使用

スコットガスリーのEntity Framework 4のcode-first devで 最新の投稿 を少し試してみると思いました。SqlServerを使用する代わりに、MySqlを使用しようとしています。これが私のweb.configの関連部分です(これはAsp.Net MVC 2アプリです)。

<connectionStrings>
    <add name="NerdDinners"
         connectionString="Server=localhost; Database=NerdDinners; Uid=root; Pwd=;"
         providerName="MySql.Data.MySqlClient"/>
  </connectionStrings>
  <system.data>
    <DbProviderFactories>
      <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.2.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    </DbProviderFactories>
  </system.data>

チュートリアルと同じように、EF4が自動的にデータベースを生成することを期待しています。代わりに、NerdDinnersデータベースが存在しないという内部例外を伴うProviderIncompatibleExceptionをスローします。

けっこうだ;私は行って、それが機能するかどうかを確認するためだけにMySql dbを作成し、代わりに別のProviderIncompatibleExceptionを取得しました。今回は、「DatabaseExistsはプロバイダーでサポートされていません」。

私が認めるのは、Entity Frameworkを深く掘り下げたのはこれが初めて(私は主にLinq to Sqlにこだわっています)で、これはすべて先週リリースされたCode-First CTPですべて実行されています。とはいえ、ここで私が間違っていることや、回避できる既知の問題はありますか?

29
Dusda

はい、ようやくいくつかの注目点で機能しました。

  • DBを作成できません。すでに存在している必要があります
  • DBContext名を使用して、各DBコンテストの接続文字列を作成する必要があります(上記の例では、接続文字列は「NerdDinners」という名前で存在する必要があります)。デフォルトの接続文字列だけではありません(それ以外の場合はSQLを使用します)。
  • コンテキストの定義に使用するDBSet名をテーブルの名前として使用するため、名前を付ける際は注意してください。

全体として、長い道のりですが、結局そこにあります

**更新MySQLを使用してMVCサイトをデプロイする場合は、DataFactoryをweb.configに追加する必要があるので、もう1つ注意してください。通常、MySqlコネクタとサポートされているMySQLのバージョンの違いが原因です。 (頭をひっかいた後、他の情報源から回答が見つかりました)追加するだけです:

  <system.data> 
    <DbProviderFactories> 
      <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.3.6.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" /> 
    </DbProviderFactories> 
  </system.data>

あなたのweb.configへの別のセクションとしてバージョン番号を設定することを確認してくださいサイトと一緒にデプロイしたMySQL.Data.dllの(MySQL DLLを「ローカルとしてコピー」することも良いアイデアです)互換性を確保します。

26
Darkside

もう1つの興味深い点-「MySQLデータプロバイダー」エントリをローカルmachine.config(私の場合はC:\ Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.config)に追加すると、接続できます。 Visual Studioを介してMySqlインスタンスに...

2
ianhorton

この質問と回答は、より大きなEFプロジェクトをSQLからmySQLに移行するのに非常に役立つので、メモを追加して、それらが役立つことを願っています。

前述のように、接続文字列の名前は、System.Data.Entity.DbContextを拡張するクラスの名前と一致する必要があります。

MySQLコネクタを使用してEFでテーブルを作成する方法はまだないようですが、SQL作成スクリプトを使用および変更して、mySQLテーブルを生成できます。これを行うために見つけた最も簡単な方法は、テーブルを再作成するためにコードが必要かどうかに応じて、拡張DbContextのOnModelCreating関数をコメントアウトおよびコメントアウトすることでした。私がこれをより頻繁に行っていることがわかった場合は、依存関係注入を使用してこれを解決し、mySQLまたはMSSQL構成に基づいた別のクラスを用意する予定です。

開発ボックスとサーバーに正しいmySQLコネクタ.dllがパッケージ化されていることを確認する方が、webconfigでDbFactoryProvidersを混乱させるよりも簡単であることがわかりました。プロジェクト/ソリューションビルドパッケージでパッケージ化を正しく行うには、接続文字列の行だけが必要であり、DbFactoryProviders行は必要ないことを意味します。

MySQL識別子の大文字と小文字の区別を0から1に変更する必要がありました。この設定がないと、EFが接続するSQLは、固定ケーステーブルと比較して、オブジェクトの大文字と小文字が混在するため、そこにあるテーブルを見つけることができませんでした。 mySQLが作成します。

2
AlexC