エンティティ フレームワークを使用して WCF .net 4.0 サービスを呼び出すと、このエラーが発生します。
The 'DbProviderFactories' section can only appear once per config file
これは、EF を使用するサーバー上の最初のアプリであり、他の .net 4.0 WCF サービスはこのエラーを受け取りません。
サーバー上のマシン構成ファイルを編集せずにこのエラーを修正する方法はありますか?
エンティティ フレームワークを使用して WCF .net 4.0 サービスを呼び出すと、このエラーが発生します。
The 'DbProviderFactories' section can only appear once per config file
これは、EF を使用するサーバー上の最初のアプリであり、他の .net 4.0 WCF サービスはこのエラーを受け取りません。
サーバー上のマシン構成ファイルを編集せずにこのエラーを修正する方法はありますか?
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>
おそらく、変更したいマシン全体の設定を上書きする web.config エントリを作成できます。
ここで説明します:
machine.config を web.config でオーバーライドする
<clear />
Web 構成のタグ内に命令を入れてDbProviderFactories
、マシン構成で作成された重複エントリをクリアして上書きします。したがって、machine.config でエラーの回避策をハックします。
@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)
{
}