豚吐露@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

まずは、WebAPIのProjectを作成する。MVC5のヤツでお願いします。

『インストール済み』んトコの[テンプレート]-[Visual C#]-[Web]を選択して『ASP.NET Web アプリケーション』を使うとMVC5なWebアプリケーションprojectになる。
無かったら...何か突っ込めば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』も一緒に入る。

もっかい、『オンラインの検索』に『Entity』と入力。
見つかった『EntityFramework』もinstallする。

ここまでやると、Web.Configに勝手に設定が追加されてる。
自分でいじらんといけんのは、22行目。
『connectionString="User Id=USERID;Password=PASSWD;Data Source=ORCL"』って感じになってるので、それぞれ自分の環境にあった値に変更する。
11g以降の簡易接続も可能らしいので『ntsnames.ora』が無くても安心。
わしの環境だとtnsnames.oraが見えんくて、名前取れんかったんで、簡易接続を利用した。

  1. <entityFramework>
  2. <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
  3. <providers>
  4. <provider invariantName="Oracle.ManagedDataAccess.Client" type="Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices, Oracle.ManagedDataAccess.EntityFramework, Version=6.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
  5. <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
  6. </providers>
  7. </entityFramework>
  8. <system.data>
  9. <DbProviderFactories>
  10. <remove invariant="Oracle.ManagedDataAccess.Client" />
  11. <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" />
  12. </DbProviderFactories>
  13. </system.data>
  14. <oracle.manageddataaccess.client>
  15. <version number="*">
  16. <dataSources>
  17. <dataSource alias="SampleDataSource" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL))) " />
  18. </dataSources>
  19. </version>
  20. </oracle.manageddataaccess.client>
  21. <connectionStrings>
  22. <add name="OracleDbContext" providerName="Oracle.ManagedDataAccess.Client" connectionString="User Id=USERID;Password=PASSWD;Data Source=//IPADDR:PORT/ORCL" />
  23. </connectionStrings>


ココからは、接続に必要なクラスを作る。
CODE FASTとかDB FASTとか正直どうでも良くて、繋がってO/R Mapper利用できれば良いんです。(´Д`)

いくつかファイル追加した後の状況はこんな感じ。
#ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (width=)

  • dto
まずは、使いたいTable定義と対になるdtoクラスの追加。

tableのカラムに合わせて型を定義してく。
『char』や『varchar2』とかなら『string』。
『date』とかの日時関係なら『DateTime』。
『number』とか数値関係なら『int』や『double』。
するとこんな感じになる。
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel.DataAnnotations;
  4. using System.Linq;
  5. using System.Web;
  6.  
  7. namespace Hoge.Models.dto
  8. {
  9. public class USER_MST
  10. {
  11. [Key]
  12. public string USERID { get; set; }
  13. public string PASSWORD { get; set; }
  14. public string NAME { get; set; }
  15. public DateTime UPDATEDATE { get; set; }
  16. }
  17. }

  • DbContext
『EF 6.x DbContext ジェネレーター』使えると何か良い事あるんかもしれんけど...
とりあえず、『Models』を右クリックして、『connectionStrings』に『name』で定義されてる文字列名『OracleDbContext』でクラスを追加。

『DbContext』を継承してやって...
Schema名は必ずOnModelCreatingで設定すること。設定せんと強制的に『dbo』になっちゃう。
  1. using Hoge.Models.dto;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Data.Entity;
  5. using System.Linq;
  6. using System.Web;
  7.  
  8. namespace Hoge.Models
  9. {
  10. public class OracleDbContext : DbContext
  11. {
  12. public DbSet<USER_MST> UserMst { get; set; }
  13.  
  14. public string Schema { get; set; }
  15.  
  16. public OracleDbContext(string schema = "HOGE")
  17. : base()
  18. {
  19. Schema = schema;
  20. }
  21.  
  22. protected override void OnModelCreating(DbModelBuilder modelBuilder)
  23. {
  24. base.OnModelCreating(modelBuilder);
  25. modelBuilder.HasDefaultSchema(Schema);
  26. }
  27. }
  28. }

  • Controller
とりあえず、なんかのコントローラが無いと処理のトリガがありません。
と言う訳で、コントローラを追加する。


と、こんなファイルができる。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Net;
  5. using System.Net.Http;
  6. using System.Web.Http;
  7.  
  8. namespace Hoge.Controllers
  9. {
  10. public class ValuesController : ApiController
  11. {
  12. // GET api/<controller>
  13. public IEnumerable<string> Get()
  14. {
  15. return new string[] { "value1", "value2" };
  16. }
  17.  
  18. // GET api/<controller>/5
  19. public string Get(int id)
  20. {
  21. return "value";
  22. }
  23.  
  24. // POST api/<controller>
  25. public void Post([FromBody]string value)
  26. {
  27. }
  28.  
  29. // PUT api/<controller>/5
  30. public void Put(int id, [FromBody]string value)
  31. {
  32. }
  33.  
  34. // DELETE api/<controller>/5
  35. public void Delete(int id)
  36. {
  37. }
  38. }
  39. }

使わない所が多いので、不要な部分を削除してから、Getメソッド内に処理を追加。
異常系とかの必要な処理が十分に追加されてないことにも注意ね。
  1. using Hoge.Models;
  2. using Hoge.Models.dto;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Net;
  7. using System.Net.Http;
  8. using System.Web.Http;
  9.  
  10. namespace Hoge.Controllers
  11. {
  12. public class ValuesController : ApiController
  13. {
  14. // GET api/<controller>
  15. public IEnumerable<USER_MST> Get()
  16. {
  17. try
  18. {
  19. using (var db = new OracleDbContext())
  20. {
  21. var users = db.UserMst.ToList();
  22. return users;
  23. }
  24. }
  25. catch (Exception e)
  26. {
  27. }
  28. return null;
  29. }
  30. }
  31. }


環境が揃ったので、さっき追加したAPIに接続子てみる。
デバッグ実行すると、ブラウザが立ち上がるハズなので...URLの後ろに『api/values』を入力。

http://localhost:9999/api/values

valuesの部分はコントローラクラス名から『Controller』を削ったものね。

で、ちゃんと動いてたら、こんな風に返ってくる。ヽ(=´▽`=)ノ
  1. <ArrayOfUSER_MST xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Hoge.Models.dto">
  2. <USER_MST>
  3. <PASSWORD>hogepassword</PASSWORD>
  4. <UPDATEDATE>2016-01-07T15:18:57</UPDATEDATE>
  5. <USERID>hoge</USERID>
  6. <NAME>ほげほげ</NAME>
  7. </USER_MST>
  8. <USER_MST>
  9. <PASSWORD>hagepassword</PASSWORD>
  10. <UPDATEDATE>2016-01-07T15:20:27</UPDATEDATE>
  11. <USERID>hage</USERID>
  12. <NAME>はげはげ</NAME>
  13. </USER_MST>
  14. <USER_MST>
  15. <PASSWORD>fugapassword</PASSWORD>
  16. <UPDATEDATE>2016-01-07T15:23:35</UPDATEDATE>
  17. <USERID>fuga</USERID>
  18. <NAME>ふがふが</NAME>
  19. </USER_MST>
  20. </ArrayOfUSER_MST>


とりあえず、ここまで...疲れた...2日かかった...(;´Д`)



更新日: 2016年01月20日 (水) 21時11分33秒

名前:
コメント:

すべてのコメントを見る
記事メニュー
ウィキ募集バナー