7

对于我的一生,我无法让我的 C# WinApp 使用 MySql 连接器 6.6.5.0(MySql.Data参考)和 MySql Entity 6.5.4.0(MySql.Data.Entity参考)与带有 MySql 数据库的 Entity Framework 5.0 一起工作。在 Visual Studio 2012 上使用 .Net Framework 4.5。在撰写本文时,以上版本都是最新的稳定版本。

这是我在 app.config 上的内容

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <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" />
    </DbProviderFactories>
  </system.data>
  <connectionStrings>
    <add name="MyConnectionName" 
         connectionString="Server=mysql13.myserver.com.br;Database=mydb;User Id=username;Pwd=pa$$w0rd;" 
         providerName="MySql.Data.MySqlClient" />
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data">
    </defaultConnectionFactory>
  </entityFramework>
  <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.6.5.0" newVersion="6.6.5.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

在代码中

用户类

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual List<Permission> Permissions { get; set; }

    public User()
    {
        Permissions = new List<Permission>();
    }
}

public class Permission
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
}

public class UserContext : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Permission> Permissions { get; set; }
}

创建新记录

        using (var db = new UserContext())
        {
            Permission permission1 = new Permission() { Name = "Permission 1", Description = "The desc 1" };
            Permission permission2 = new Permission() { Name = "2nd Perm", Description = "Desc2" };
            User user = new User() { Name = "Joao" };
            user.Permissions.Add(permission1);
            user.Permissions.Add(permission2);

            db.Users.Add(user);
            db.SaveChanges();
        }

我得到了例外db.Users.Add(user);

System.InvalidOperationException was unhandled
  HResult=-2146233079
  Message=Failed to set Database.DefaultConnectionFactory to an instance of the 'MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data' type as specified in the application configuration. See inner exception for details.
  Source=EntityFramework
  StackTrace:
       at System.Data.Entity.Internal.AppConfig.<.ctor>b__1()
       at System.Lazy`1.CreateValue()
    --- End of stack trace from previous location where exception was thrown ---
       at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
       at System.Lazy`1.get_Value()
       at System.Data.Entity.Internal.AppConfig.get_DefaultConnectionFactory()
       [removing the rest of the stack]
  InnerException: System.InvalidCastException
       HResult=-2147467262
       Message=Unable to cast object of type 'MySql.Data.MySqlClient.MySqlClientFactory' to type 'System.Data.Entity.Infrastructure.IDbConnectionFactory'.
       Source=EntityFramework
       StackTrace:
            at System.Data.Entity.Internal.AppConfig.<.ctor>b__1()
       InnerException: 

我已经尝试了几件事,包括Culture=neutral, PublicKeyToken=c5687fc88969c44d在该DbProviderFactories部分中添加无济于事..

我使用 NuGet 包管理器添加了实体框架、MySql 数据连接器和 MySql.Data.Entity。

我看过许多其他类似问题的帖子,但找不到明确的解决方案,尤其是版本控制组合 EF 5 + MySql Connector 6.6.5.0。

有人做过这项工作吗?您可以同时发布 app.config 和代码以使其正常工作吗?

4

4 回答 4

5

MySQL 连接器 6.6.5 仅支持此处提到的实体框架 4.3 。我个人使用过它,到目前为止效果很好。但是,如果您特别需要 Entity Framework 5,则需要使用 MySQL Connector 6.6.7 Beta,它现在支持它,如此所述。我还没有尝试过 v 6.6.7。

更新 1:您可以在此处找到使用 EF 4.3 代码优先与 MySQL 连接器 6.6 的博客文章。

更新 2:此处使用 EF 4.3 和 MySql 连接器 6.6.5 的示例 .NET 4.5 控制台应用程序。

于 2013-05-07T06:59:12.637 回答
0

我的大部分生产 web.config。我已经取出了所有公司特定的东西......此外,这个配置是为 MVC4/EF5/OData 5.2 设置的,带有 IIS 压缩。相当复杂的东西......大部分都不需要。但我想你想要我的原始配置作为参考。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
      <section name="EdgeService.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </sectionGroup>
  </configSections>

  <appSettings>
    <add key="log4net.Config.Watch" value="True" />
    <add key="log4net.Config" value="EdgeService.log4net.config" />
    <add key="PullVersionPeriod" value="30000" />
    <add key="webpages:Version" value="2.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="PreserveLoginUrl" value="true" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
  </appSettings>
  <system.web>
    <httpRuntime maxRequestLength="12288" maxUrlLength="10999" maxQueryStringLength="2097151"/>
    <compilation debug="true" targetFramework="4.5">
      <assemblies>
        <add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
        <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
        <add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
        <add assembly="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
        <add assembly="System.Web.Helpers" />
      </assemblies>
    </compilation>
    <authentication mode="Windows" />
    <pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID" />
  </system.web>
  <system.data>
    <DbProviderFactories>
      <clear />
      <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description="ADO.Net driver for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.5.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    </DbProviderFactories>
  </system.data>
  <system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="false" />
  </system.serviceModel>
  <system.webServer>
    <handlers>
      <remove name="svc-Integrated-4.0" />
      <remove name="WebDAV" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
    <modules runAllManagedModulesForAllRequests="true">
      <remove name="WebDAVModule" />
      <add name="PerRequestLifestyle" type="Castle.MicroKernel.Lifestyle.PerWebRequestLifestyleModule, Castle.Windsor" />
    </modules>
    <security>
      <requestFiltering>
        <requestLimits maxQueryString="100000" />
      </requestFiltering>
      <authentication>
        <!--C:\Windows\System32\inetsrv\config\applicationHost.config-->
        <anonymousAuthentication enabled="false" />
        <windowsAuthentication enabled="true">
          <providers>
            <clear />
            <add value="Negotiate" />
          </providers>
        </windowsAuthentication>
      </authentication>
    </security>
    <httpCompression>
      <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" staticCompressionLevel="9" dynamicCompressionLevel="4" />
      <dynamicTypes>
        <add enabled="true" mimeType="Application/*" />
        <add enabled="true" mimeType="application/atom+xml;type=feed;charset=utf-8" />
      </dynamicTypes>
    </httpCompression>
  </system.webServer>
  <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.6.4.0" newVersion="6.6.4.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="MySql.Data.Entity" publicKeyToken="c5687fc88969c44d" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-6.6.4.0" newVersion="6.6.4.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="MySql.Web" publicKeyToken="c5687fc88969c44d" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-6.6.4.0" newVersion="6.6.4.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="EntityFramework" publicKeyToken="b77a5c561934e089" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.4.0.0" newVersion="5.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Data.Edm" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.2.0.0" newVersion="5.2.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Data.OData" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.2.0.0" newVersion="5.2.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Spatial" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.2.0.0" newVersion="5.2.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>
于 2013-05-08T07:03:28.500 回答
0

我在 EF 中使用 mysql 的第一天遇到了同样的问题。我发现你的配置不正确,应该是

  <entityFramework>
<defaultConnectionFactory type="MySql.Data.Entity.MySqlConnectionFactory, MySql.Data.Entity">
</defaultConnectionFactory>

并确保您使用 .net framework 4.5 和 .net 4.5 以及 EF 5 的 mysql 连接器库,因为 .net 4 的连接器仅支持 EF 4.4。

于 2013-08-20T05:26:54.297 回答
0

听起来有一些奇怪的程序集分辨率问题。尝试删除assemblyBinding配置文件中的元素,然后运行 ​​NuGet 的Add-BindingRedirect命令。

于 2013-05-08T05:11:39.673 回答