使用MySqlentity framework4和Code-First Development CTP

我以为我会用Scott Guthrie在Entity Framework 4的代码优先的开发中的最新post进行实验。而不是使用Sql Server,我试图使用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自动生成我的数据库。 相反,它会抛出一个ProviderIncompatibleException,内部exception抱怨NerdDinners数据库不存在。

很公平; 我去为它创buildMySql数据库,只是为了看看事情是否会起作用,并得到另一个ProviderIncompatibleException。 这一次,“DatabaseExists不被提供者支持”。

我承认,这是我第一次深入研究Entity Framework(我大部分都是Linq to Sql),而这些都是在上周发布的Code-First CTP上运行的。 这就是说,我在这里做错了什么,或者是一个可以解决的已知问题?

对了,终于有了几个兴趣点的工作。

  • 无法创build数据库,必须已经存在
  • 您必须使用DBContext名称(在上面的示例中连接string必须以名称“NerdDinners”存在)创build每个DB比赛的连接string,而不仅仅是一个默认的连接string(否则它将使用SQL)
  • 它将使用您使用的DBSet名称的名称来定义您的上下文作为表的名称,所以在命名它们时要小心。

总而言之,漫长的道路,但到最后

**更新另一点需要注意的是,当使用MySQL部署你的MVC站点时,你最需要的也是添加一个DataFactory到你的web.config。 通常是因为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,以确保兼容性。

另一个值得注意的地方 – 如果你在本地的machine.config(C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Config \ machine.config)中添加“MySQL Data Provider”通过Visual Studio到您的MySql实例…

这个问题和答案对于我把一个更大的EF项目从SQL迁移到mySQL非常有用,所以我想我会添加我的笔记,并希望它们是有用的:

如前所述,连接string的名称必须与扩展System.Data.Entity.DbContext的Class的名称相匹配。

似乎仍然没有办法在EF中使用mySQL连接器创build表,但是可以使用和修改SQL创build脚本来生成mySQL表。 我发现最简单的方法是在扩展DbContext上注释OnModelCreating函数,具体取决于代码是否需要重新创build表。 如果我发现我更经常这样做,我打算通过使用dependency injection来解决这个问题,并且使用基于mySQL或MSSQLconfiguration的独立类。

我发现确保开发包和服务器在发布版中包含正确的mySQL连接器.dll比在webconfig中的DbFactoryProviders混乱更容易。 在项目/解决scheme构build包中获取正确的包装意味着我只需要连接string行而不是DbFactoryProviders行,我发现这些行很难在多台机器上一致地工作。

我需要将mySQL Identifier Case Sensitivity从0到1的设置中更改。如果没有此设置,EF连接的SQL无法find由于对象的混合大小写名称与固定大小写表相比所导致的表mySQL创build。