.NetCoreApp1.1でEntityFrameworkCore+Sqlite+CodeFirst

# 概要
まず第一にこの記事の作成日が<b>2017/08/14</b>であることを記しておく

というのも、現状EntityFrameworkCoreに関する記事はいくつも見つかるがバージョンによってえらい差があるらしく、そのまま実行してまともにDBにアクセスできるものが無かった

きっとこの記事ももうちょい先(具体的には.NetCoreAppの標準が2.0になった時)には役に立たなくなっているはずなので、あくまで<b>今時点では</b>こうすれば動くというものを書いていく

なお、先に言っておくが、下記の手順は「動かすためのもの」であって最適な方法ではないと思う。というか最適な方法なんてものがあったらさっさとpreview版のときの情報を消して公式ドキュメントを更新してほしい

# そもそもEntityFrameworkCoreって？
~~ggrks~~

早い話がO/Rマッパー

もっとわかりやすく言うと、sqlをできるだけ直に書かないことでプログラマがオブジェクト指向の範囲の知識でDBとデータをやり取りする仕組みを提供するframework

# Sqliteって？
~~ggrks~~

ちっちゃくて軽いDBだと思えばあっている　つまりは幼女だ

ちなみにEntityFrameworkCoreは根本的にはDBの実装に左右されないようになっているので、一番最初の接続に関するところを変えればSqlServerだろうが何だろうが同様に使える

今回は単に自分がSqliteを使いたかっただけ

# CodeFirstって？
~~ggrks~~

コードで書かれたModelが先にあって、DB・テーブルはそれを元にフレームワークが勝手に作ってくれる　そんな感じの作り方のこと

# プロジェクトを作る
適当にクラスライブラリで作っとく

別にクラスライブラリじゃなくてコンソールアプリでも同じだと思う、多分

1. Visual Studio 2017を開く
2. 新規作成 → プロジェクト → Visual C# → .NET Core → クラスライブラリ

# Nugetからインストール
以下をインストール

* Microsoft.EntityFrameworkCore.Sqlite.Design(ver2.0.0-preview1-final)
 
安定版じゃないけど知らん

* Microsoft.EntityFrameworkCore.Sqlite(ver2.0.0)

とくに説明不要

* SQLitePCLRaw.bundle_e_sqlite3(ver1.1.8)

こいつが一番苦戦した

多分なんだけど、上述のEntityFrameworkCore.Sqliteが接続するときにSQLitePCLを使ってて、そいつの初期化処理に必要なんだと思う　小二時間返して

# 使い方
以下のように書いたら動いた

ただし情報がバラバラで自分には合ってるのかどうかも判断できない


HogeDBContext.cs

```c#
  using Microsoft.EntityFrameworkCore;

  public class HogeDBContext : DbContext
    {
        //こいつを元にTableが作られる
        public DbSet<HogeModel> HogeHogeModel { get; set; }
        private static bool _created = false;

        public HogeDBContext()
        {
            if (!_created)
            {
                _created = true;

                //DBの中身を空にするらしい
                Database.EnsureDeleted();

                //DbSetを元にTableを作るらしい
                Database.EnsureCreated();
            }
        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            base.OnConfiguring(optionsBuilder);
            //DBのパスを入れよう
            optionsBuilder.UseSqlite(@"Data Source='hoge\hoge.db'");
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            //こんなん初見でわかるわけないやろ
            SQLitePCL.Batteries_V2.Init();
        }

    }
```

HogeModel.cs

```c#
public class HogeModel
{
    public String Id { get; set; };
    public String Name { get; set; };    
}

```

HogeDBContextTest.cs

```c#

    [TestClass]
    public class HogeDBContextTest
    {
        [TestMethod]
        public void AddTest()
        {
            using (var context = new HogeDBContext())
            {
                for (int i = 0; i < 3; i++)
                {
                    context.HogeHogeModel.Add(new HogeModel() { Id = i.ToString(), Name = "test" + i.ToString() });
                }

                context.SaveChanges();

                var val = 0;
                foreach (var item in context.HogeHogeModel)
                {
                    Assert.AreEqual(val.ToString(), item.Id);
                    Assert.AreEqual("test" + val.ToString(), item.Name);
                    val++;
                }
                
            }
        }
    }

```

# 結果
テストは投げやりになって適当に書いたけど、動くはず

# 感想
ver2.0.0-preview2-finalって何？刻みすぎじゃない？トネガワさんもびっくりだよ