豚吐露@wiki
OracleDBをEntityFramework6で操作したい
最終更新:
ohden
-
view
OracleDBをEntityFramework6で操作したい
Windows 7-64bit Professional
Visual Studio 2013 Professional
.NET Framework 4.5
Entity Framework 6.1.3
Official Oracle ODP.NET, Managed Entity Framework Driver 12.1.2400
Official Oracle ODP.NET, Managed Driver 12.1.2400
Visual Studio 2013 Professional
.NET Framework 4.5
Entity Framework 6.1.3
Official Oracle ODP.NET, Managed Entity Framework Driver 12.1.2400
Official Oracle ODP.NET, Managed Driver 12.1.2400
まずは、WebAPIのProjectを作成する。MVC5のヤツでお願いします。
『インストール済み』んトコの[テンプレート]-[Visual C#]-[Web]を選択して『ASP.NET Web アプリケーション』を使うとMVC5なWebアプリケーションprojectになる。
無かったら...何か突っ込めばok。w
NuGetで『MVC5』検索したら何か出てくるよ。きっと...
無かったら...何か突っ込めばok。w
NuGetで『MVC5』検索したら何か出てくるよ。きっと...
とりあえずNuGet使って必要なlibraryを突っ込む。
システム上の制約から『Oracle.DataAccess 2.112.1.0』を使おうかと考えとったが、どうやらもうちょっと新しいversionでないとEntityFrameworkには使えんらしい。
と言う訳で、NuGetパッケージの管理を起動。
左のtreeから『オンライン』を選択し、右上の『オンラインの検索』に『Oracle』と入力。
『Official Oracle ODP.NET, Managed Entity Framework Driver』が見つかるから、選択して『インストール』ボタン押下。
勝手に『Official Oracle ODP.NET, Managed Driver』も一緒に入る。
左のtreeから『オンライン』を選択し、右上の『オンラインの検索』に『Oracle』と入力。
『Official Oracle ODP.NET, Managed Entity Framework Driver』が見つかるから、選択して『インストール』ボタン押下。
勝手に『Official Oracle ODP.NET, Managed Driver』も一緒に入る。
もっかい、『オンラインの検索』に『Entity』と入力。
見つかった『EntityFramework』もinstallする。
見つかった『EntityFramework』もinstallする。
ここまでやると、Web.Configに勝手に設定が追加されてる。
自分でいじらんといけんのは、22行目。
『connectionString="User Id=USERID;Password=PASSWD;Data Source=ORCL"』って感じになってるので、それぞれ自分の環境にあった値に変更する。
11g以降の簡易接続も可能らしいので『ntsnames.ora』が無くても安心。
わしの環境だとtnsnames.oraが見えんくて、名前取れんかったんで、簡易接続を利用した。
自分でいじらんといけんのは、22行目。
『connectionString="User Id=USERID;Password=PASSWD;Data Source=ORCL"』って感じになってるので、それぞれ自分の環境にあった値に変更する。
11g以降の簡易接続も可能らしいので『ntsnames.ora』が無くても安心。
わしの環境だとtnsnames.oraが見えんくて、名前取れんかったんで、簡易接続を利用した。
- <entityFramework>
- <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
- <providers>
- <provider invariantName="Oracle.ManagedDataAccess.Client" type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
- <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
- </providers>
- </entityFramework>
- <system.data>
- <DbProviderFactories>
- <remove invariant="Oracle.ManagedDataAccess.Client" />
- <add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
- </DbProviderFactories>
- </system.data>
- <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>
- <connectionStrings>
- <add name="OracleDbContext" providerName="Oracle.ManagedDataAccess.Client" connectionString="User Id=USERID;Password=PASSWD;Data Source=//IPADDR:PORT/ORCL" />
- </connectionStrings>
ココからは、接続に必要なクラスを作る。
CODE FASTとかDB FASTとか正直どうでも良くて、繋がってO/R Mapper利用できれば良いんです。(´Д`)
CODE FASTとかDB FASTとか正直どうでも良くて、繋がってO/R Mapper利用できれば良いんです。(´Д`)
いくつかファイル追加した後の状況はこんな感じ。
#ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (width=)
- dto
まずは、使いたいTable定義と対になるdtoクラスの追加。

tableのカラムに合わせて型を定義してく。
『char』や『varchar2』とかなら『string』。
『date』とかの日時関係なら『DateTime』。
『number』とか数値関係なら『int』や『double』。
するとこんな感じになる。

tableのカラムに合わせて型を定義してく。
『char』や『varchar2』とかなら『string』。
『date』とかの日時関係なら『DateTime』。
『number』とか数値関係なら『int』や『double』。
するとこんな感じになる。
- using System;
- using System.Collections.Generic;
- using System.ComponentModel.DataAnnotations;
- using System.Linq;
- using System.Web;
-
- namespace Hoge.Models.dto
- {
- public class USER_MST
- {
- [Key]
- public string USERID { get; set; }
- public string PASSWORD { get; set; }
- public string NAME { get; set; }
- public DateTime UPDATEDATE { get; set; }
- }
- }
- DbContext
『EF 6.x DbContext ジェネレーター』使えると何か良い事あるんかもしれんけど...
とりあえず、『Models』を右クリックして、『connectionStrings』に『name』で定義されてる文字列名『OracleDbContext』でクラスを追加。

『DbContext』を継承してやって...
Schema名は必ずOnModelCreatingで設定すること。設定せんと強制的に『dbo』になっちゃう。
とりあえず、『Models』を右クリックして、『connectionStrings』に『name』で定義されてる文字列名『OracleDbContext』でクラスを追加。

『DbContext』を継承してやって...
Schema名は必ずOnModelCreatingで設定すること。設定せんと強制的に『dbo』になっちゃう。
- using Hoge.Models.dto;
- using System;
- using System.Collections.Generic;
- using System.Data.Entity;
- using System.Linq;
- using System.Web;
-
- namespace Hoge.Models
- {
- public class OracleDbContext : DbContext
- {
- public DbSet<USER_MST> UserMst { get; set; }
-
- public string Schema { get; set; }
-
- public OracleDbContext(string schema = "HOGE")
- : base()
- {
- Schema = schema;
- }
-
- protected override void OnModelCreating(DbModelBuilder modelBuilder)
- {
- base.OnModelCreating(modelBuilder);
- modelBuilder.HasDefaultSchema(Schema);
- }
- }
- }
- Controller
とりあえず、なんかのコントローラが無いと処理のトリガがありません。
と言う訳で、コントローラを追加する。


と、こんなファイルができる。
と言う訳で、コントローラを追加する。


と、こんなファイルができる。
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Net;
- using System.Net.Http;
- using System.Web.Http;
-
- namespace Hoge.Controllers
- {
- public class ValuesController : ApiController
- {
- // GET api/<controller>
- public IEnumerable<string> Get()
- {
- }
-
- // GET api/<controller>/5
- public string Get(int id)
- {
- return "value";
- }
-
- // POST api/<controller>
- public void Post([FromBody]string value)
- {
- }
-
- // PUT api/<controller>/5
- public void Put(int id, [FromBody]string value)
- {
- }
-
- // DELETE api/<controller>/5
- public void Delete(int id)
- {
- }
- }
- }
使わない所が多いので、不要な部分を削除してから、Getメソッド内に処理を追加。
異常系とかの必要な処理が十分に追加されてないことにも注意ね。
異常系とかの必要な処理が十分に追加されてないことにも注意ね。
- using Hoge.Models;
- using Hoge.Models.dto;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Net;
- using System.Net.Http;
- using System.Web.Http;
-
- namespace Hoge.Controllers
- {
- public class ValuesController : ApiController
- {
- // GET api/<controller>
- public IEnumerable<USER_MST> Get()
- {
- try
- {
- {
- var users = db.UserMst.ToList();
- return users;
- }
- }
- catch (Exception e)
- {
- }
- return null;
- }
- }
- }
環境が揃ったので、さっき追加したAPIに接続子てみる。
デバッグ実行すると、ブラウザが立ち上がるハズなので...URLの後ろに『api/values』を入力。
デバッグ実行すると、ブラウザが立ち上がるハズなので...URLの後ろに『api/values』を入力。
http://localhost:9999/api/values
valuesの部分はコントローラクラス名から『Controller』を削ったものね。
で、ちゃんと動いてたら、こんな風に返ってくる。ヽ(=´▽`=)ノ
- <ArrayOfUSER_MST xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Hoge.Models.dto">
- <USER_MST>
- <PASSWORD>hogepassword</PASSWORD>
- <UPDATEDATE>2016-01-07T15:18:57</UPDATEDATE>
- <USERID>hoge</USERID>
- <NAME>ほげほげ</NAME>
- </USER_MST>
- <USER_MST>
- <PASSWORD>hagepassword</PASSWORD>
- <UPDATEDATE>2016-01-07T15:20:27</UPDATEDATE>
- <USERID>hage</USERID>
- <NAME>はげはげ</NAME>
- </USER_MST>
- <USER_MST>
- <PASSWORD>fugapassword</PASSWORD>
- <UPDATEDATE>2016-01-07T15:23:35</UPDATEDATE>
- <USERID>fuga</USERID>
- <NAME>ふがふが</NAME>
- </USER_MST>
- </ArrayOfUSER_MST>
とりあえず、ここまで...疲れた...2日かかった...(;´Д`)
更新日: 2016年01月20日 (水) 21時11分33秒