我以为我会在实体框架4的代码优先开发中使用Scott Guthrie的latest 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,内部异常抱怨NerdDinners数据库不存在。
足够公平;我去为它创建了MySql数据库,只是为了看看事情是否会起作用,而是得到了另一个ProviderIncompatibleException。这次,“提供商不支持DatabaseExists”。
我承认,这是我第一次真正钻研实体框架(我主要坚持使用Linq to Sql),而这一切都是在上周才发布的Code-First CTP上运行的。那就是说,我在这里做错了什么,或者是一个可以解决的已知问题?
答案 0 :(得分:26)
是的,最后让它与几个兴趣点合作。
总而言之,漫长的道路,但最终还是存在
**更新 另外需要注意的是,在使用MySQL部署MVC站点时,您最需要的还需要在web.config中添加一个DataFactory。 通常是因为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确保兼容性。
答案 1 :(得分:2)
另一个兴趣点 - 如果您添加&#34; MySQL数据提供商&#34;进入你的本地machine.config(在我的情况下为C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Config \ machine.config)然后你可以通过Visual Studio连接到你的MySql实例......
答案 2 :(得分:2)
这个问题和答案对于我将一个更大的EF项目从SQL迁移到mySQL非常有用所以我想我会添加我的笔记并希望它们有用:
如上所述,连接字符串的名称必须与扩展System.Data.Entity.DbContext的Class的名称相匹配。
似乎仍无法使用mySQL连接器在EF中创建表,但您可以使用和修改SQL创建脚本来生成mySQL表。我发现这样做的最简单方法是在扩展的DbContext上注释和注销OnModelCreating函数,具体取决于是否需要重新创建表的代码。如果我发现我经常这样做,我计划通过使用依赖注入来解决这个问题,并且基于mySQL或MSSQL配置有单独的类。
我发现更容易确保开发盒和服务器在发布中打包了正确的mySQL连接器.dll,而不是在webconfig中使用DbFactoryProviders。在项目/解决方案构建包中获得正确的包装意味着我只需要连接字符串行而不是DbFactoryProviders行,而我发现这些行很难在多台机器上一致地工作。
我需要将mySQL Identifier Case Sensitivity从我的0设置更改为1.如果没有此设置,EF连接的SQL无法找到那里的表,因为我的对象的混合大小写名称与mySQL创建的固定案例表。