2010-07-19 231 views
29

我以为我会用Scott Guthrie的latest post在实体框架4的代码优先开发实验一下。而不是使用Sql Server,我试图使用MySQL的。这里是我的web.config中的相关部分(这是一个Asp.Net MVC 2应用程序):使用MySql实体框架4和代码优先开发CTP

<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

你说得对,mysql提供者确实存在(http://stackoverflow.com/questions/76488/using-mysql-with-entity-framework/848539#848539)。 CTP位有可能存在错误,或者MySQL提供程序缺少功能性(或两者)。 – marcind 2010-07-19 19:52:24

+0

你是否可以在MVC 4中使用MySQL的简单成员? – 2012-11-28 16:34:38

回答

25

右键,终于得到了与感兴趣的几点工作。

  • 无法创建一个数据库,必须已经存在
  • 你必须创建使用的DbContext名称为每个DB比赛(在上面的示例中的ConnectionString必须名为“NerdDinners”的存在)的连接字符串,而不是只是一个默认的(否则它将使用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,以确保兼容性

+0

将您的问题标记为答案,因为您找到了方法:)。令人敬畏的工作! – Dusda 2011-02-08 00:22:04

+0

您是否必须自己创建表格还是为您生成表格? – DennyFerra 2011-03-07 15:55:04

+0

实体框架仍然不能不幸地创建表,所以你必须自己去做(也请注意在某些主机上表名和列名区分大小写)。 – Darkside 2011-05-13 09:20:04

2

另一景点 - 如果添加了“MySQL的数据提供者”进入到本地的machine.config(C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Config \ machine.config在我的情况下),然后您可以通过Visual Studio连接到您的MySql实例...

2

这个问题,答案一直对我很有用从SQL迁移较大的EF项目到MySQL,所以我想我会增加我的笔记,并希望他们是有用的:

如前所述连接字符串的名称有以匹配扩展System.Data.Entity.DbContext的类的名称。

似乎还是没有办法创建使用MySQL连接器EF表,但你可以使用和修改SQL创建脚本来生成MySQL表。我发现这样做的最简单方法是根据是否需要代码重新创建表,在扩展DbContext上注释OnModelCreating函数。如果我发现我正在更频繁地执行此操作,我计划通过使用依赖注入来解决此问题,并且基于mySQL或MSSQL配置具有独立的类。

我发现更容易确保开发包和服务器具有正确的mySQL连接器.dll打包在发行版中,而不是与webconfig中的DbFactoryProviders混淆。在项目/解决方案构建包中获取正确的包装意味着我只需要连接字符串行,而不需要DbFactoryProviders行,我发现这些行很难在多台机器上一致地工作。

我需要将mySQL标识符大小写敏感度从我设置为0的设置改为1.如果没有此设置,EF连接的SQL无法找到由于我的对象的混合大小写名称而导致的表, mySQL创建的固定大小写表。

相关问题