Глючное поведение в DbPRoviderFactories.GetFactoryClasses()

Я строю приложение MVC. У меня есть это в web.config в system.data:

<system.data>
    <DbProviderFactories>
        <remove invariant ="System.Data.SqlClient" />
        <remove invariant="System.Data.Odbc" />
        <remove invariant="System.Data.Oledb" />
        <remove invariant="System.Data.OracleClient" />     

        <add name="SqlClient Data Provider" 
             invariant="System.Data.SqlClient" 
             description=".Net Framework Data Provider for SqlServer" 
             type="System.Data.SqlClient.SqlClientFactory, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
    </DbProviderFactories>

Этот провайдер приходит по ссылке в проекте от Nuget, а не от GAC. В GAC у меня есть:

В DemoController у меня есть:

    DataTable table = DbProviderFactories.GetFactoryClasses();
        DbProviderFactory msSqlDbProviderFactory = DbProviderFactories.GetFactory("System.Data.SqlClient");
        var dbProviderFactories = new string[table.Rows.Count+1,table.Columns.Count+1]; //+1 for readability in display
        ushort i = 0, j = 0;
        foreach (DataRow row in table.Rows)
        {
            foreach (DataColumn column in table.Columns)
            {
                dbProviderFactories[i, j] = row[column].ToString();
                j++;
            }
            j = 0;
            i++;
        }

И в результате вы можете увидеть на скриншоте. Очень странное поведение DbProviderFactories

Кто-нибудь может сказать мне, почему все провайдеры (ole, oracle, odbc) все еще там, хотя я удалил их в конфигурации? Кто-нибудь может мне сказать, почему, когда в массиве фабрик нет такой фабрики, как фабрика для SqlCleint, которую я могу назвать

DbProviderFactory msSqlDbProviderFactory = DbProviderFactories.GetFactory("System.Data.SqlClient");

а заводить все равно? Это странное поведение я не могу объяснить.

Я столкнулся с проблемой, сделав так: 1. Инициализировал DbContext с ctor по умолчанию, когда он имеет строку подключения в web.config, вот так:

<connectionStrings>
        <add name="MyDbContext"
              connectionString="Data Source=MSSQL-SERVER-INSTANCE;Initial Catalog=MyDb.mdf;Trusted_Connection=False;User ID=u;Password=p"
             providerName="System.Data.SqlClient"/>
</connectionStrings>
  1. Попытался использовать DbMigrator с DbMigrationConfig следующим образом:

string connectionString = "Источник данных =MSSQL-SERVER-INSTANCE; Начальный каталог =MyDb.mdf;Trusted_Connection=False; Идентификатор пользователя =u; Пароль =p";

    DbMigrationsConfiguration<InitDbContext> cfg = new DbMigrationsConfiguration<InitDbContext>
                    {   
                        AutomaticMigrationsEnabled = true,
                        MigrationsAssembly = Assembly.Load("Migrations"),
                        MigrationsNamespace = "Migrations",
                        TargetDatabase = new DbConnectionInfo(connectionString, "System.Data.SqlClient")
                    };

                DbMigrationsConfiguration cfg = CreateMigrationsConfig(connectionString);
                new DbMigrator(cfg).Update();

И тут появляется неприятное "Невозможно найти запрошенный поставщик данных.Net Framework".

Исходный код DbProviderFactories

0 ответов

Другие вопросы по тегам