生きることは簡単です

日々細々と生きています

"ストア プロバイダー インスタンスで 'get_ProviderFactory' メソッドを呼び出した後に NULL が返されました"の対処法

エンティティフレームワークOracleに接続してアレコレしていたんですが、ある日急に下記のエラーが出て微動だにしなくなりました。

System.Data.Entity.Core.ProviderIncompatibleException: 型 'System.Data.OracleClient.OracleConnection' のストア プロバイダー インスタンスで 'get_ProviderFactory' メソッドを呼び出した後に NULL が返されました。ストア プロバイダーが正しく機能していない可能性があります。

 例外はBeginTransactionでOracleとの接続を行おうとしているコードで発生していました。接続すらできないって感じですね。

結論から書くと、原因はApp.Configに記載されているOracleの接続文字列にありました。プロバイダー名を接続文字列の要素に入れるんですが、それが下記のように書かれていました。

providerName="System.Data.OracleClient"

ちょっと調べてみましたが、System.Data.OracleClientはだいぶ前に廃止されたものらしいですね。
プロジェクトのNugetパッケージを確認したところ、Oracle.ManagedDataAccessが入っていたので...

providerName="Oracle.ManagedDataAccess.Client"

 こんな感じで書き直したら動くようになりました。もともとこうやって書いてたんですが、誰かが書き換えてテスト環境においてたみたいです。嫌な話ですね。

そもそもOracleとエンティティフレームワークの相性が抜群に悪く、SQLServerだとできることができなかったりします。既存のDBからコードファーストのモデルを作ろうとしても、接続でうまくいかないんですよね。Oracleが公式で配布しているNugetパッケージを使っても変なところで落ちたりします。

このあたりの情報って調べても全然出てこないので苦労するんですよね。少なくとも日本語の情報はほとんどないので、こういうときに英語ができればなって思います...。