.NET CoreからEntity Framework Coreを経由してOracle Autonomous Databaseへ接続 

#概要
.net からOracle Autonomous Databaseへ接続してみました。
(Oracle Autonomous Databaseには、Autonomous Data Warehouse（ADW）とAutonomous Transaction Processing（ATP）の二種類がありますが、接続方法は同じです。）
#1 準備
##1.1 Autonomous Transaction Processingデータベース作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563186/b1730ec2-496a-3963-2deb-51dce34029ed.png)

##1.2 クライアントの資格証明(ウォレット)のダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563186/913e43d9-e50a-574a-7b44-073b727e7444.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563186/2ded44bd-c050-20aa-f456-d8af9ecc3326.png)

ウォレットファイルを保存します。

##1.3 テスト用テーブルの作成
###1.3.1 テーブルBlogsの作成(列BlogIdとUrlが存在します)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563186/849f0a21-4662-03b6-eef8-13aeca8b07ca.png)

#2 接続テスト

##2.1 Visual Studio 起動、プロジェクトAtptest1の作成 (.netCore console application)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563186/5cade26c-56ba-d0f2-ae32-d2d0c8a066d0.png)
##2.2 NugetからOracle.EntityFrameworkCore最新版をインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563186/73358322-f8bd-c89d-53ef-117d80f3382a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563186/6ed4c1a9-d729-9a6b-9eea-86a274a13a83.png)
##2.3 ウォレットファイル解凍
上記1.2 でダウンロードしたウォレットファイルをAtptest1のbinフォルダーに解凍します。

※任意のフォルダーに解凍して問題ありませんが、下記を注意する必要があります。

- tnsnames.oraとsqlnet.oraはexeと同じフォルダーに保存する必要がある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563186/9d7adbac-f2e1-28ae-ee09-c32e9eb0f8bd.png)
##2.4 sqlnet.ora編集
上記2.3で解凍されたファイルの中のsqlnet.oraを環境にあわせてDIRECTORY部分を修正します。（相対パス、絶対パスどちらでも問題ありません）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563186/a8dfa7a0-3e79-f4f1-8b22-7527d543413b.png)

``` 
WALLET_LOCATION = (SOURCE = (METHOD = file) (METHOD_DATA = (DIRECTORY="./")))
SSL_SERVER_DN_MATCH=yes
```
##2.5 簡単なコードでOracle ATP接続動作確認
### 2.5.1 サンプルコード
```
using System;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;

namespace Atptest1
{
    class Program
    {
        public class BloggingContext : DbContext
        {
            public DbSet<Blog> Blogs { get; set; }

            protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
            {
                optionsBuilder.UseOracle(@"User Id=ADMIN;Password=Welcome!123456;Data Source=db201912241112_medium");
               //  User Id=<your username> 
               //  例 User Id=ADMIN
               //  Password=<your password> 
               //  例 Password=Welcome!123456
               //  Data Source=<your servicename>
               //  例 your servicename=db201912241112_medium
            }
        }

        public class Blog
        {
            public int BlogId { get; set; }
            public string Url { get; set; }
        }

        static void Main(string[] args)
        {
            using (var db = new BloggingContext())

            {
                var blog = new Blog { Url = "https://blogs.oracle.com" };
                db.Blogs.Add(blog);
                db.SaveChanges();

            }

            using (var db = new BloggingContext())
            {
                var blogs = db.Blogs;
            }
        }
    }
}
```
※「コード中の接続文字列（ID、パスワード、データソース）は、環境に合わせて変更してください。」

→サービス名については、下記のマニュアルをご参照ください。
https://docs.oracle.com/cd/E83857_01/paas/atp-cloud/atpug/connect-predefined.html

###2.5.2 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563186/1a861f20-e76e-e312-99fc-06f65f8e8c9f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563186/4e5b8bfa-c8eb-2215-ce6b-00651d63991b.png)
無事に接続して、Entity Framework Coreを経由してデータをATPに挿入できました！