8

エンティティ フレームワークを使用して WCF .net 4.0 サービスを呼び出すと、このエラーが発生します。

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

これは、EF を使用するサーバー上の最初のアプリであり、他の .net 4.0 WCF サービスはこのエラーを受け取りません。

サーバー上のマシン構成ファイルを編集せずにこのエラーを修正する方法はありますか?

4

4 に答える 4

10

IBM DB2 .NET プロバイダーをインストールすると、空の DbProviderFactories が発生します。以下を参照してください。2 番目の空のエントリ 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>
于 2014-02-07T11:30:38.503 に答える
4

おそらく、変更したいマシン全体の設定を上書きする web.config エントリを作成できます。

ここで説明します:

machine.config を web.config でオーバーライドする

<clear />Web 構成のタグ内に命令を入れてDbProviderFactories、マシン構成で作成された重複エントリをクリアして上書きします。したがって、machine.config でエラーの回避策をハックします。

于 2012-12-11T18:45:50.233 に答える
1

@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)
            {

            }
于 2014-04-01T22:05:11.347 に答える