WebアプリケーションをEntityFramework4.5に移植しています。私の主な目標は、MSSQLデータベースとOracleデータベースの両方をサポートし、プログラムで(Global.asaxで)ターゲットとするデータソースをORMに指示できるようにすることです。SQLスキーマとOracleスキーマは明らかに機能的に同じです。これは、破棄したい別のORMを使用した本番環境ですでに使用しているアプローチです。
注:テストしているマシンには、Windows8リリースプレビュービルド840064ビット、Visual Studio Professional 2012 RC 11.0.50706.0、および.NETFramework4.5.50501が搭載されています。これは標準の開発マシンではありませんが(他のマシンにはXPと7 w / Visual Studio2010および.NET4があります)、これらの新しいテクノロジをテストするために使用している新しいマシンです。この新しいテクノロジーのいずれかが問題になる可能性があるかどうかはわかりません。「標準」の開発マシンでまだテストしていません。
短縮版
すぐ下で状況を詳しく説明しますが、主な質問は次のとおりです。
- [新しいADO.NETエンティティデータモデルの追加]ウィザードで、インストールしたODP.NETデータプロバイダーが表示されないため(以下を参照)、Oracleデータベースからモデルを作成できません。なんで?さらに、[Visual Studioについて]ポップアップに、VisualStudio用のOracleDeveloperToolsが表示されません。Oracle Developer Toolsが何らかの形で機能していないのではないかと心配していますが、Oracle Universal Installerは、すべてが正しくインストールされていると言っています(そして、何度か再起動しました)。
- この要件を達成するためのベストプラクティスは何ですか?
ロングバージョン
まず、SQLServerデータベースからエンティティデータモデルを作成しました。ここまでは順調ですね。
次に、 http: //www.oracle.com/technetwork/topics/dotnet/utilsoft-086879.htmlからODAC11.2リリース4とOracleDeveloper Tools for Visual Studio(11.2.0.3.0)をインストールしました。
モデルSIAEntities
(から継承 ObjectContext
)を次のように初期化することができました:
System.Data.EntityClient.EntityConnectionStringBuilder builder = new System.Data.EntityClient.EntityConnectionStringBuilder();
builder.Metadata = "res://*/SIA.Models.SIAModelOracle.ssdl|res://*/Models.SIAModel.csdl|res://*/Models.SIAModel.msl";
builder.ProviderConnectionString = "data source=***;persist security info=True;user id=***;password=***";
builder.Provider = "Oracle.DataAccess.Client";
SIAEntities db2 = new SIAEntities(builder.ConnectionString);
ここSIA.Models.SIAModelOracle.ssdl
で、は.edmxのSSDL部分をオーバーライドし、次の変更を加えたカスタム書き込みファイル(埋め込みリソース)です。
Provider
ルートSchema
ノードの属性をに設定Oracle.DataAccess.Client
- Oracleに相当するものに変換されたすべてのデータ型名(datetime> date、nvarchar> varchar2、image> blobなど)
- にマップする
oracle.dataaccess.client
ノードとにweb.config
マップbool
するノードnumber(1,0)
tinyint
number(3,0)
最初のクエリ(単純SELECT
)の実行時にエラーが発生しました。dbに対して実行されるクエリの二重引用符が原因であると追跡し、大文字と小文字を区別しました。
カスタム.ssdlファイルを手動で編集し、すべてを大文字にすることで、EFにテーブルを「認識」させ、列を次々に認識させることができますが、このソリューションをあまりプッシュしませんでした(したがって、テーブル全体を読み取る前に停止しました)。 a)あまりきれいに見えませんでしたb).ssdlと.csdl / .mslの部分の間のリンクを理解するのが難しいので、大文字にする場所としない場所がわかりませんでした。
この手作業を回避するために私が考えていた別の戦略は、Oracleスキーマから別のモデルを生成し、ObjectContext
どちらか一方の選択を処理する別のクラスで2つをラップすることですが、質問2にあるように、私はできません。それ。