Entity Framework 6とMySQLのメモ(Windows)
nugetで「MySQL.ConnectorNET.Entity」をインストール。他のは無視。
うまくいけば、アセンブリの参照はこんな感じになる。
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> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <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.8.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider> </providers> </entityFramework> <system.data> <DbProviderFactories> <remove name="MySQL Data Provider" 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.8.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" /> </DbProviderFactories> </system.data> </configuration>
そこで、EF6 Code Firstのコードを書く。
using System; using System.Data.Entity; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Database.SetInitializer(new DropCreateDatabaseAlways<BlogContext>()); using (var db = new BlogContext()) { db.Blogs.Add(new Blog { Name = "aaa" }); db.SaveChanges(); foreach (var blog in db.Blogs) { Console.WriteLine("BlogId={0},Value={1}", blog.BlogId, blog.Name); } } } } public class BlogContext : DbContext { public DbSet<Blog> Blogs { get; set; } } public class Blog { public int BlogId { get; set; } public string Name { get; set; } } }
App.config
には接続文字列を足す。
<connectionStrings> <add name="BlogContext" providerName="MySql.Data.MySqlClient" connectionString="Server=localhost;Uid=root;Pwd=XXXX;Database=testdb;"/> </connectionStrings>
これで実行しても例外(ConfigurationErrorsException)が発生する。
答えはMySQL Connector/Net Developer Guideに書いてあった。
MySQL用の新しい
DbConfiguration
クラスを設定しましょう。このステップは省略することもできますが、省略せず設定することを強く推奨します。なぜなら、MySQLのすべての依存関係解決モジュール(dependency resolvers)が追加されるからです。以下の3つの方法があります。
- コンテキストクラスに
DbConfigurationTypeAttribute
カスタム属性を付ける。
[DbConfigurationType(typeof(MySqlEFConfiguration))]
- アプリケーションのスタートアップコードで
DbConfiguration.SetConfiguration(new MySqlEFConfiguration())
を呼び出す。- 構成ファイルで
DbConfiguration
型を設定する。
<entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6">
カスタムの
DbConfiguration
クラスを作れば、依存関係解決モジュールを必要なものだけ追加することもできます。
ためしに構成ファイルでやってみた。
<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.8.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider> </providers> </entityFramework>
なるほど動いた。