概要
まず第一にこの記事の作成日が2017/08/14であることを記しておく
というのも、現状EntityFrameworkCoreに関する記事はいくつも見つかるがバージョンによってえらい差があるらしく、そのまま実行してまともにDBにアクセスできるものが無かった
きっとこの記事ももうちょい先(具体的には.NetCoreAppの標準が2.0になった時)には役に立たなくなっているはずなので、あくまで今時点ではこうすれば動くというものを書いていく
なお、先に言っておくが、下記の手順は「動かすためのもの」であって最適な方法ではないと思う。というか最適な方法なんてものがあったらさっさとpreview版のときの情報を消して公式ドキュメントを更新してほしい
そもそもEntityFrameworkCoreって?
ggrks
早い話がO/Rマッパー
もっとわかりやすく言うと、sqlをできるだけ直に書かないことでプログラマがオブジェクト指向の範囲の知識でDBとデータをやり取りする仕組みを提供するframework
Sqliteって?
ggrks
ちっちゃくて軽いDBだと思えばあっている つまりは幼女だ
ちなみにEntityFrameworkCoreは根本的にはDBの実装に左右されないようになっているので、一番最初の接続に関するところを変えればSqlServerだろうが何だろうが同様に使える
今回は単に自分がSqliteを使いたかっただけ
CodeFirstって?
ggrks
コードで書かれたModelが先にあって、DB・テーブルはそれを元にフレームワークが勝手に作ってくれる そんな感じの作り方のこと
プロジェクトを作る
適当にクラスライブラリで作っとく
別にクラスライブラリじゃなくてコンソールアプリでも同じだと思う、多分
- Visual Studio 2017を開く
- 新規作成 → プロジェクト → 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
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
public class HogeModel
{
public String Id { get; set; };
public String Name { get; set; };
}
HogeDBContextTest.cs
[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って何?刻みすぎじゃない?トネガワさんもびっくりだよ