【问题标题】:Using MySql with Entity Framework 4 and the Code-First Development CTP将 MySql 与 Entity Framework 4 和 Code-First Development CTP 一起使用
【发布时间】:2011-03-18 01:31:30
【问题描述】:

我想我会在使用 Entity Framework 4 的代码优先开发中对 Scott Guthrie 的 latest post 进行一些试验。我尝试使用 MySql,而不是使用 Sql Server。以下是我的 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 上运行。也就是说,我在这里做错了什么,还是可以解决的已知问题?

【问题讨论】:

  • 你说得对,确实存在 mysql 提供程序 (stackoverflow.com/questions/76488/…)。可能 CTP 位有错误,或者 MySQL 提供程序缺少功能(或两者兼有)。
  • 你能在 MVC 4 中使用简单的成员资格吗?

标签: mysql asp.net-mvc entity-framework-4 code-first ctp


【解决方案1】:

好吧,终于在几个兴趣点上工作了。

  • 无法创建数据库,必须已经存在
  • 您必须使用 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 以确保兼容性。

【讨论】:

  • 将您的答案标记为答案,因为您找到了方法:)。很棒的作品!
  • 您必须自己创建表格还是它会为您生成表格?
  • 不幸的是,实体框架仍然无法创建表,因此您必须自己创建表(还要注意某些主机的表名和列名区分大小写)。
  • 一种解决方法是使用 SQL Express 或 SQL CE 测试和生成数据库,然后转储数据库的创建脚本。然后你可以在 MySQL 上运行它来创建数据库(注意任何非 tsql 后的差异)
  • 您能否澄清“它将使用您用来定义上下文的 DBSet 名称的名称作为表的名称”?在 SQL Server 端,它使用模型名称(类名称),如果启用该约定,则使用复数形式。您是说在 MySQL 中它使用您在 DbContext 中分配给该 DbSet 的属性名称吗?这似乎是一种奇怪而随意的方法变化......
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-06-27
      • 1970-01-01
      • 2012-01-25
      • 1970-01-01
      • 2011-06-06
      • 2011-03-03
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      相关资源
      最近更新 更多