20
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

空のプロジェクトからASP.NET MVC5 EntityFramework6 for Oracleを試す

Last updated at Posted at 2016-03-19

#経緯
前記事「空のプロジェクトからASP.NET MVC5 EntityFramework6」では、SQL Serverによる接続でしたが、仕事で主に使うデータベースはOracleであるため、Oracleで同じことが出来るのかを確認する。
仕事の合間を使って確認したかったが空き時間が出来なかったため、自宅で確認することにした。
自宅なので無料版の「Oracle Database Express Edition 11g Release 2 for Windows x64」をダウンロードしてインストールしている。

#環境

  • Windows 10 Home 64bit
  • Oracle Data 11g Express Edition 64bit
  • Visual Studio 2015 Community
  • SQL Developer 4.1.3

#Oracleユーザーの作成
今回、スキーマ名(ユーザー名)は「TEST」で作成しました。
参照:Oracle Database 11g Express Edition -ただでOracleのデータベース使いましょう。

#ODP.NET版のEntity Frameworkのインストール
Visual StudioのNuGetパッケージの管理にて「Oracle」で検索します。
「Oracle.ManagedDataAccess.EntityFramework」をインストールします。
もう1つの「Oracle.ManagedDataAccess」は自動的に一緒にインストールされます。

OracleMangerInstall.png

OracleMangerInstall2.png

#ODP.NET Managed Driver(管理対象ドライバ)について
すべてがマネージコードで記述されているフルマネージドなドライバになります。
このため、これまでのODP.NETとは違いネイティブなドライバ(Instant Clientなど)を必要としない軽量なドライバになっています。

これまでも、System.Data.OracleClientを使えばOracleクライアントは不要でしたが、.NET4以降では非推奨となっています。また、Oracleに最適化されているわけではないので、Oracleのバージョン違いによるプロパティ指定やフェッチ制御の細かな設定などは指定できませんでした。
Javaの場合、Oracle Thin JDBC Driverを使えば、Oracle クライアントを介さずせずに直接 Oracleに接続することができるので、やっとJavaに追いついた感じですかね。

#Web.configの変更
Web.configの変更する部分のみ抽出

変更前Web.config
  <connectionStrings>
    <add name="StandardContext" connectionString="Data Source=(local);Initial Catalog=yaju;User ID=sa;Password=admin;" providerName="System.Data.SqlClient"/>
    <add name="OracleDbContext" providerName="Oracle.ManagedDataAccess.Client"
      connectionString="User Id=oracle_user;Password=oracle_user_password;Data Source=oracle"/>
  </connectionStrings>

 <oracle.manageddataaccess.client>
    <version number="*">
      <dataSources>
        <dataSource alias="SampleDataSource" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL))) "/>
      </dataSources>
    </version>
  </oracle.manageddataaccess.client>

SQLServer版のStandardContextをコメントアウトしてOracleDBContextをStandardContextに変更します。Oracle Database 11g Express Editionのサービス名は一般的に「XE」(tnsnames.oraを確認)となっているため、「ORCL」から「XE」に変更します。

変更後Web.config
  <connectionStrings>
    <!-- <add name="StandardContext" connectionString="Data Source=(local);Initial Catalog=yaju;User ID=sa;Password=admin;" providerName="System.Data.SqlClient"/> -->
    <add name="StandardContext" providerName="Oracle.ManagedDataAccess.Client"
      connectionString="User Id=test;Password=fuga;Data Source=XE"/>
  </connectionStrings>

  <oracle.manageddataaccess.client>
    <version number="*">
      <dataSources>
        <dataSource alias="XE" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=XE))) "/>
      </dataSources>
    </version>
  </oracle.manageddataaccess.client>

#例外エラーが発生
Web.configを変更して実行するとエラー「ユーザー'dbo'は存在しません」が発生しました。
OracleError.png

ネットにて「ユーザー'dbo'は存在しません」で検索すると下記サイトがヒット
【ASP.NET(MVC)】ODP.NET Entityデータモデルからのテーブル作成・操作について

接続するDB(ドライバ)にかかわらずデフォルトのユーザーは「dbo」となるため、スキーマを指定することで解決。
modelBuilder.HasDefaultSchema("スキーマ名");
チュートリアル
Entity Framework Code First and Code First Migrations for Oracle Database

#スキーマを指定
ModelsのStandardContext.csにて、OnModelCreatingメソッドを追加する。

StandardContext.cs
namespace MvcBasic.Models
{
    public class StandardContext : DbContext
    {
        public DbSet<Book> Books { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            //スキーマを指定(デフォルトではdbo)
            modelBuilder.HasDefaultSchema("TEST");  
        }
    }
}

#最終結果
※ViewsのShared内のHeader.cshtmlとFooter.cshtmlは「MvcBasic」に変更しました。
OracleResult.png

#今後について
今回Oracleを使用したが、Oracle内のテーブル自体を参照したわけではないので、本来のEntityFrameworkの機能を使っての参照と登録・更新・削除を作成していきます。

#参照
ODP.NET Managed Driver(管理対象ドライバ)についての私的まとめ
Oracle Data Provider for .NET 12.1のODP.NET管理対象ドライバ
ODP.NETをNuGetからインストールする
オラクルクライアントレスでの接続(.NET)
【C#】Oracleへの接続をクライアントインストール無しで行う
EntityFrameworkとODP.NETを使ったアプリのデプロイ方法
ODP.NET Managed DriverでOracleクライアントいらず

20
24
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?