Ошибка «Параметр не поддерживается» при использовании SQL Server с MySQL - PullRequest
0 голосов
/ 01 апреля 2019

Я пытаюсь получить данные из MySQL и SQL Server в одном консольном приложении. Мне удается получить данные из MySQL, однако при попытке получить данные из SQL Server я получил ошибку System.ArgumentException: 'Option not supported. Parameter name: multipleactiveresultsets'.

Вот мое 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" />
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
  </startup>

  <connectionStrings>
    <add name="MySQLDb" providerName="MySql.Data.MySqlClient" connectionString="server=localhost;port=3306;database=sakila;uid=some_user;password=some_password"/>
    <add name="SQLDb" providerName="System.Data.SqlClient" connectionString="data source=USER-PC\SQLEXPRESS;initial catalog=MyDatabase;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"/>
  </connectionStrings>

  <entityFramework codeConfigurationType="MySql.Data.Entity.MySqlEFConfiguration, MySql.Data.Entity.EF6">
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework"/>
    <providers>
      <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6"/>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer"/>
    </providers>
  </entityFramework>
</configuration>

И мой C #:

#region MySQL.
{
    var dbContext = new MySQLDb();
    var dbSet = dbContext.Set<Actor>();

    var actors = dbSet.ToList();
}
#endregion

#region SQLServer.
{
    var dbContext = new SQLDb();
    var dbSet = dbContext.Set<User>();

    var users = dbSet.ToList(); // <-- Throw exception.
}
#endregion

Если я отключу секцию entityFramework в app.config и блок кода MySQL в своем коде C #, я могу без проблем получать данные с SQL Server.

Информация о версии

  • MySQL.Data.Entity 6.10.8
  • NET Framework 4.6.1

Есть идеи?


Обновление 1

Обнаружил, что тип соединения для MySQLDb равен MySql.Data.MySqlClient.MySqlConnection, так что работает просто отлично. Но при создании экземпляра SQLDb тип подключения по-прежнему MySql.Data.MySqlClient.MySqlConnection вместо System.Data.SqlClient.SqlConnection. Как мы должны это исправить?

1 Ответ

0 голосов
/ 02 апреля 2019

Проблема в том, что мы используем MySql.Data.Entity.MySqlEFConfigurationapp.config), который устанавливает фабрику соединений по умолчанию на использование MySqlConnectionFactory.

Решение состоит в том, чтобы использовать пользовательский DbConfiguration вместо MySql.Data.Entity.MySqlEFConfiguration, чтобы удержаться от установки фабрики соединений по умолчанию.

public class MySQLDbConfiguration : DbConfiguration
{
    public MySQLDbConfiguration()
    {
        SetProviderServices(MySqlProviderInvariantName.ProviderName, new MySqlProviderServices());
        SetProviderFactory(MySqlProviderInvariantName.ProviderName, new MySqlClientFactory());
    }
}

Объявите экземпляр как только для чтения где-то в коде,

private static readonly MySQLDbConfiguration DBConfig = new MySQLDbConfiguration();

и настройте конфигурацию ДО ТОГО, ЧТОБЫ использовать любые функции EF

DbConfiguration.SetConfiguration(DBConfig);

И наш app.config теперь становится

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
  </startup>

  <connectionStrings>
    <add name="MySQLDb" providerName="MySql.Data.MySqlClient" connectionString="server=localhost;port=3306;database=sakila;uid=some_user;password=some_password"/>
    <add name="SQLDb" providerName="System.Data.SqlClient" connectionString="data source=USER-PC\SQLEXPRESS;initial catalog=MyDatabase;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"/>
  </connectionStrings>
</configuration>

Если вы решили использовать app.config вместо получения пользовательского DbConfiguration, вы можете сделать следующее

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <!-- Alternative to custom DbConfiguration. -->
  <configSections>
    <section name = "entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <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 name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.10.8.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"/>
    </DbProviderFactories>
  </system.data>

  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
  </startup>

  <connectionStrings>
    <add name="MySQLDb" providerName="MySql.Data.MySqlClient" connectionString="server=localhost;port=3306;database=sakila;uid=some_user;password=some_password"/>
    <add name="SQLDb" providerName="System.Data.SqlClient" connectionString="data source=USER-PC\SQLEXPRESS;initial catalog=MyDatabase;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"/>
  </connectionStrings>
</configuration>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...