Раздел «DbProviderFactories» может отображаться только один раз для каждого файла конфигурации.

Мы получаем эту ошибку при вызове службы WCF .net 4.0 с использованием инфраструктуры сущностей.

The 'DbProviderFactories' section can only appear once per config file

Это первое приложение на сервере, использующее EF, и другие службы .net 4.0 WCF не получают эту ошибку.

Есть ли способ исправить эту ошибку без редактирования файла конфигурации машины на сервере?


person Chad    schedule 11.12.2012    source источник
comment
Причина в том, что наша серверная команда хочет, чтобы я доказал, что это проблема, прежде чем они захотят внести изменения в конфигурацию машины. Поэтому я должен решить проблему без редактирования конфигурации, чтобы они исправили конфигурацию машины... да, эта проблема   -  person Chad    schedule 11.12.2012
comment
Можете ли вы опубликовать биты файла конфигурации там, где он определяет раздел DbProviderFactories? На этой странице говорится, что вы можете удалить второй тег DbProviderFactories, и это устраняет проблему. Это ваша проблема?: forums.asp.net/t/1693277.aspx/ 1   -  person Eric Leschinski    schedule 11.12.2012
comment
@EricLeschinski - Нет, я не могу иметь доступ к конфигу. Я знаю об этом исправлении ... это то, что я пытаюсь доказать, нужно, обходя его.   -  person Chad    schedule 11.12.2012
comment
Они даже не позволят вам СМОТРЕТЬ файл конфигурации?? Вау, я давно не играл в Turf wars. Звучит как проблема теории игр/политики. Надень свою политическую шляпу. Отправьте указанную выше ссылку и сообщение об ошибке своему менеджеру и скажите: «Пожалуйста, перешлите эти заметки серверной команде, так как я физически не могу исправить их программное обеспечение с ошибками, поскольку они не позволяют мне даже увидеть его». Тогда это не в ваших руках. Не используйте молот, чтобы ударить по огню, используйте эффективный ответ: воду. Вы заставите этих позёрских политиков искать новую выгодную позицию в мгновение ока.   -  person Eric Leschinski    schedule 11.12.2012


Ответы (4)


Возможно, вы могли бы создать записи web.config, которые переопределяют любые настройки на уровне машины, которые вы хотите изменить.

Описано здесь:

Переопределить machine.config с помощью web.config

Помещение инструкции <clear /> внутри тегов DbProviderFactories в веб-конфигурации, чтобы очистить, а затем переопределить повторяющиеся записи, сделанные в конфигурации машины. Таким образом, обходим ошибку в файле machine.config.

person Eric Leschinski    schedule 11.12.2012
comment
Спасибо, я смог использовать это, чтобы переопределить конфигурацию машины и доказать, что им нужно исправить конфигурацию машины... I ‹3 политика - person Chad; 21.12.2012

Установка поставщика IBM DB2 .NET приводит к созданию пустого DbProviderFactories, см. ниже. Просто удалите вторую пустую запись DbProviderFactories

<system.data>
    <DbProviderFactories>
        <add name="IBM DB2 for i .NET Provider" invariant="IBM.Data.DB2.iSeries" description=".NET Framework Data Provider for IBM i" type="IBM.Data.DB2.iSeries.iDB2Factory, IBM.Data.DB2.iSeries, Version=12.0.0.0, Culture=neutral, PublicKeyToken=9cdb2ebfb1f93a26" />
    </DbProviderFactories>
    <DbProviderFactories />
</system.data>
person yonsk    schedule 07.02.2014
comment
Есть ли способ исправить эту ошибку без редактирования файла конфигурации машины на сервере? - У меня нет доступа к конфигу машины, чтобы его удалить. - person Chad; 07.02.2014
comment
Привет, Чад, я не знаю, мне пришлось коснуться и изменить этот файл. Попросите системного администратора сделать это за вас. - person yonsk; 21.02.2014

Вам необходимо обновить файл Machine.config, расположенный по указанным ниже путям.

  • C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\Machine.Config
  • C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\Machine.Config

Для 64-битных машин Machine.config будет находиться в ...\Framework64\...

Блок, на который стоит обратить внимание:

<system.data>
    <DbProviderFactories>
        <add name="IBM DB2 for i5/OS .NET Provider" invariant="IBM.Data.DB2.iSeries" description=".NET Framework Data Provider for i5/OS" type="IBM.Data.DB2.iSeries.iDB2Factory, IBM.Data.DB2.iSeries, Version=12.0.0.0, Culture=neutral, PublicKeyToken=9cdb2ebfb1f93a26"/>
        <add name="Microsoft SQL Server Compact Data Provider" invariant="System.Data.SqlServerCe.3.5" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=3.5.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>
        </DbProviderFactories>
<!-- This is the line to remove - empty element --><DbProviderFactories/>
</system.data>
person Sundeep    schedule 11.03.2015
comment
из вопроса Is there any way to correct this error with out editing the machine config file on the server? Это ключевая часть... - person Chad; 11.03.2015
comment
Прости, Чад. Я пропустил эту строчку. Я просто сосредоточился на названии. Я искал способ исправить ошибку и нашел решение в другом месте. Я решил поделиться этим здесь, так что это будет полезно для кого-то. - person Sundeep; 12.03.2015
comment
Важное примечание: вы должны быть администратором, чтобы иметь возможность сохранить файл после удаления строки. - person Alexandre; 03.08.2016

Поскольку @yonsk уже упоминал, почему возникает эта проблема (повторяющаяся запись), вы можете создать консольное приложение, которое может исправить файл machine.config, а затем вызывать это консольное приложение из установщика вашего приложения или из вашего приложения всякий раз, когда вы получаете Исключение. Следующий код можно использовать для консольного приложения, которое исправит файл machine.config.

class Program
    {
        static void Main()
        {
            string machineConfigFilePath = RuntimeEnvironment.SystemConfigurationFile;

            XDocument xdoc = XDocument.Load(machineConfigFilePath);

            XElement[] elements = xdoc.XPathSelectElements("//configuration/system.data/DbProviderFactories").ToArray();

            if (elements.Any())
            {
                foreach (XElement anElement in elements)
                {
                    if (!anElement.HasElements)
                        anElement.Remove();
                }
            }

            xdoc.Save(machineConfigFilePath);
        }
    }

Если вы хотите вызвать консольное приложение из своего приложения, вам нужно будет вызвать его как администратора. Таким образом, следующий фрагмент может помочь вызвать это консольное приложение в качестве администратора (пользователю будет предложено принять диалоговое окно..)

 try
            {
                Process process = Process.Start(new ProcessStartInfo
                {
                    Verb = "runas",
                    FileName = "/Path/to/the/console/application",
                    UseShellExecute = true,
                    CreateNoWindow = true,

                });
                process.WaitForExit();
                int exitCode = process.ExitCode;
            }
            catch (Exception ex)
            {

            }
person Emran Hussain    schedule 01.04.2014
comment
Я почти уверен, что если бы я попытался запустить, меня бы уволили... Но крутое решение. - person Chad; 02.04.2014