首页 文章

VS 2017中的MySQL和MVC实体框架不起作用

提问于
浏览
4

我正在尝试启动MVC EF Visual Studio 2017项目 . 我的数据连接都在我的本地实例上设置了MySQL,但是当我创建一个ADO.net数据模型时,我得到了图片中看到的错误:

enter image description here

这里还有另一篇文章:Can't use a MySQL connection for entity framework 6涵盖了VS 2012和2013年而不是2017年 . 以下是MySQL文档,其中说明了2017版本的哪些版本:https://dev.mysql.com/doc/visual-studio/en/visual-studio-install.html

我在用:

MySQL连接网络6.9.9 | MySQL for Visual Studio 1.2.7 | MySQL服务器5.7

MySQL.Data 6.9.9 | MySQL.Data.Entity 6.9.9 |实体框架6.1.3

所有这些都列在MySQL测试和工作 . 我今天刚刚安装了所有新产品,所以没有出色的旧版本 . 我三重检查;)

连接字符串:

<connectionStrings> <add name="MySQL" connectionString="server=localhost;port=3306;user id=root;password=password;database=localdb" providerName="MySql.Data.MySqlClient" /> </connectionStrings>


Edit

我发现这篇文章https://dev.mysql.com/doc/connector-net/en/connector-net-entityframework60.html谈到了 Build 连接但现在而不是那个错误,一旦我按下'Next',对话框就会消失 .


这只是我做错了什么或MySQL连接器坏了吗?

提前感谢您的任何建议!

4 回答

  • 2

    所以我最终做的是创建了一个新项目并完成了MySQL.Data 6.9.9的干净安装MySQL.Data.Entity 6.9.9 |实体框架6.1.3然后再次尝试制作数据模型 .

    它几乎奏效了!我得到一个错误说: 'System.Data.StrongTypingException: The value for column 'IsPrimaryKey' in table 'TableDetails' is DBNull. ---> System.InvalidCastException: Specified cast is not valid. 但很多人通过进入MySQL命令行并执行来解决这个问题: set global optimizer_switch='derived_merge=off' 你可以在这里找到这个bug:https://bugs.mysql.com/bug.php?id=79163

    无论出于何种原因,这是我的命令行的输出,以帮助MySQL的任何新手:

    enter image description here

    这解决了一切!希望有人发现这不会像我一样浪费太多时间 .

  • 0

    我要做的是重新安装MySQL for Visual Studio 2.0.5,然后完全删除并安装MySQL Connector 6.9.9 . 似乎订单确实很重要 . 之后,我完全删除了这些包,并按照这个确切的顺序重新安装:

    (之后重启Visual Studio)

    EntityFramework 6.1.3 (I tried earlier versions and they don't work, so beware)
    Mysql.Data 6.9.9
    Mysql.Data.Entity 6.9.9 (NOT Mysql.Data.Entities!!! [for 6.9.9])
    Mysql.Web 6.9.9
    

    然后,确保web.config文件中包含以下内容:

    (编辑后重启以确定)

    <entityFramework>
        <defaultConnectionFactory type="MySql.Data.Entity.MySqlConnectionFactory, MySql.Data.Entity.EF6" />
        <providers>
          <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6" />
        </providers>
      </entityFramework>
    

    (您可能需要注释掉任何现有部分并将其替换为此部分)

    我必须通过重新审视here来提醒自己的最后一步 . 这部分是我忘记的(太长时间),这导致问题中的屏幕截图中的错误 .

    最后一件事,您可能将不正确的版本复制到Visual Studio的安装位置;例如:

    C:\Program Files (x86)\Microsoft Visual Studio\ \ {Community|Enterprise|Professional} \Common7\IDE\PrivateAssemblies

    要么

    C:\Program Files (x86)\Microsoft Visual Studio \Common7\IDE\PrivateAssemblies

    MySql.Data.dll MySql.Data.Entity.EF6.dll MySql.Web.dll(可能必须先关闭Visual Studio)

    您可以选择每个文件并转到文件属性下的 Details 选项卡以查看您拥有的版本 .

    从这里(或安装它的任何地方)获取新文件: C:\Program Files (x86)\MySQL\MySQL Connector Net 6.9.9\Assemblies\v4.5 (这假设使用框架v4.5的连接器v6.9.9 [请参阅项目属性' Application->Target Framework 以确认您的设置]) .

    注意1:当您为Visual Studio安装MySQL时,它会更新 PrivateAssemblies 文件夹中的文件(请参阅上面的Visual Studio路径),所以请仔细检查上面的程序集,确保它们没有关注,并且会查看私人集会(我认为在启动期间) .

    注意2:如果出现"IsPrimaryKey"错误,see here .

    我完成的App.Config可供参考(与您的比较):

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <configSections>
        <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
        <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
      </configSections>
      <entityFramework>
        <defaultConnectionFactory type="MySql.Data.Entity.MySqlConnectionFactory, MySql.Data.Entity.EF6" />
        <providers>
          <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider>
        </providers>
      </entityFramework>
      <connectionStrings>
        <!-- Connections Strings Go Here -->
      </connectionStrings>
      <system.data>
        <DbProviderFactories>
          <remove invariant="MySql.Data.MySqlClient" />
          <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.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
        </DbProviderFactories>
      </system.data>
      <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <dependentAssembly>
            <assemblyIdentity name="MySql.Data" publicKeyToken="c5687fc88969c44d" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-6.9.9.0" newVersion="6.9.9.0" />
          </dependentAssembly>
        </assemblyBinding>
      </runtime>
    </configuration>
    
  • 2

    @James Wilkins感谢您的详细解答,我要添加,有时当您添加Mysql.data或MySQL.data.entity时,程序集版本与MySqlConnector / Net安装的程序集不匹配,因为我们经常下载最新的来自Nuget的版本,这又引起了这个问题,所以我做了什么并修复了问题,我复制了dll(Mysql.data,MySQL.data.entity和web)

    C:\Program Files (x86)\MySQL\MySQL Connector Net 6.9.9\Assemblies\v4.5
    

    到我的应用程序bin / debug文件夹并引用这些而不是从Nugets下载 . 这解决了我的问题 . 您可能还需要在app.config或web.config和packages.config文件中更新程序集版本 .

    <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.10.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d">
    

    <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d">
    

    并在packages.config中更新条目的版本

    <package id="MySql.Data" version="6.9.9" targetFramework="net452" />
      <package id="MySql.Data.Entity" version="6.9.9" targetFramework="net452" />
      <package id="MySql.Web" version="6.9.9" targetFramework="net452" />
    
  • 0

    通过在Visual Studio 2017上使用这些确切的组件,调整以确认我已经完成了所有工作 - 包括VS2017中的实体框架的db-first gui-tool-chain- .net 4.7.1 asp.net-mvc5 wev-solution (VS2017 => ver15.5.7在撰写本文时又称完全更新的VS2017):

    Entity Framework ver6.2.0 [nuget]
    MySql.Data ver6.9.11 [nuget]
    MySql.Data.Entity ver6.9.11 [nuget]
    MySql.Web ver6.9.11 [nuget]
    MySQL for Visual Studio ver2.0.5 [system-wide msi installer]
    MySql-Connector ver6.9.11 [system-wide msi installer]
    

    我尝试使用最新的MySql-Connector(版本6.60.x)但事实证明VS2017的gui工具用于db-first方法根本不起作用 . 我猜MySql-Connector必须与其他dll版本一致 .

    Web.config看起来像这样:

    <configuration>
      <configSections>
        <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
        [...]
      </configSections>
    
      <entityFramework>
        <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
          <parameters>
            <parameter value="Data Source=.; Integrated Security=True; MultipleActiveResultSets=True;" />
          </parameters>
        </defaultConnectionFactory>
        [...]
        <providers>
          <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6" />
          [...]
        </providers>
        [...]
      </entityFramework>
      [...]
      <system.data>
        <DbProviderFactories>
          <remove invariant="MySql.Data.MySqlClient" />
          <add description=".Net Framework Data Provider for MySQL" invariant="MySql.Data.MySqlClient" name="MySQL Data Provider" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data" />
        </DbProviderFactories>
      </system.data>
      [...]
    </configuration>
    

    承载.edmx文件的子项目App.config如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <configSections>
        <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework" requirePermission="false" />
        [...]
      </configSections>
      <entityFramework>
        <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
        <providers>
          <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6" />
          [...]
        </providers>
      </entityFramework>
      [...]
      <system.data>
        <DbProviderFactories>
          <remove invariant="MySql.Data.MySqlClient" />
          <add description=".Net Framework Data Provider for MySQL" invariant="MySql.Data.MySqlClient" name="MySQL Data Provider" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data" />
        </DbProviderFactories>
      </system.data>
      [...]
      <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.1" />
      </startup>
    </configuration>
    

    而packages.config:

    <?xml version="1.0" encoding="utf-8"?>
    <packages>
      <package id="EntityFramework" version="6.2.0" targetFramework="net471" allowedVersions="[6.2.0]" />
      <package id="LinqKit" version="1.1.13" targetFramework="net471" allowedVersions="[1.1.13]" />
      <package id="MySql.Data" version="6.9.11" targetFramework="net471" allowedVersions="[6.9.11]" />
      <package id="MySql.Data.Entity" version="6.9.11" targetFramework="net471" allowedVersions="[6.9.11]" />
      <package id="MySql.Web" version="6.9.11" targetFramework="net471" allowedVersions="[6.9.11]" />
    </packages>
    

    注意:packages.config已经通过[allowedVersions]有意调整,禁止将MySql软件包无意中自动升级到更新版本 . 这是因为闪避问题困扰了6.10.x版本的MySql核心 .

相关问题