29

我想我会尝试一下 Scott Guthrie 在 Entity Framework 4 的代码优先开发的最新帖子。我没有使用 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 上运行。也就是说,我在这里做错了什么,还是可以解决的已知问题?

4

3 回答 3

26

是的,终于让它在一些兴趣点上工作了。

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

总而言之,路漫漫其修远兮

**更新还有一点要注意,当使用 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 以确保兼容性也是一个好主意。

于 2011-02-07T17:55:16.317 回答
2

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

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

似乎仍然无法使用 mySQL 连接器在 EF 中创建表,但您可以使用和修改 SQL 创建脚本来生成 mySQL 表。我发现执行此操作的最简单方法是在扩展 DbContext 上注释 OnModelCreating 函数,具体取决于代码是否需要重新创建表。如果我发现我经常这样做,我计划通过使用依赖注入来解决这个问题,并基于 mySQL 或 MSSQL 配置使用单独的类。

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

我需要将 mySQL Identifier Case Sensitivity 从我设置的 0 更改为 1。如果没有此设置,EF 连接的 SQL 将无法找到存在的表,因为与固定大小写表相比,我的对象的混合大小写名称mySQL 创建的。

于 2011-12-06T10:55:46.263 回答
2

另一个兴趣点 - 如果您将“MySQL 数据提供程序”条目添加到本地 machine.config(在我的情况下为 C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.config),则可以连接通过 Visual Studio 到您的 MySql 实例...

于 2011-05-30T11:40:58.183 回答