しばやん氏のEntity Framework Core関連の記事を読んでてて、InMemoryも使えるのを知ったのでちょっと試してみました。
今のところ SQL Server 以外に SQLite と開発用の InMemory プロバイダが利用可能になっています。
Entity Framework Core 1.0 を Full .NET のコンソールアプリケーションで使ってみる - しばやん雑記
パッケージのインストール
パッケージマネージャコンソールから、以下のコマンドでInMemoryのパッケージをインストールします。
> Install-Package Microsoft.EntityFrameworkCore.InMemory -pre
ソース
DbContextOptionsBuilderのインスタンスで、UseInMemoryDatabase()を読んでやるのが唯一のポイントでしょうか。
下記サンプルでは効率悪く1000件のINSERT文が発行されますが、私の環境では約1.8秒で終わりました。すばらしい。ちなみに、SQL Serverプロバイダだと約28秒かかりました。
public class Book { public long Id { get; set; } public string Title { get; set; } } public class DatabaseContext : DbContext { public DatabaseContext(DbContextOptions options) : base(options) { } public DbSet<Book> Books { get; set; } } class Program { static void Main(string[] args) { var optionsBuilder = new DbContextOptionsBuilder<DatabaseContext>(); optionsBuilder.UseInMemoryDatabase(); // SQLServerの場合 Install-Package Microsoft.EntityFrameworkCore.InMemory -pre する // optionsBuilder.UseSqlServer( // @"Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=C:\Temp\Sample.mdf;Initial Catalog=Sample;Integrated Security=True"); using (var db = new DatabaseContext(optionsBuilder.Options)) { var sw = new Stopwatch(); sw.Start(); for (var i = 0; i < 1000; i++) { db.Books.Add(new Book() { Title = $"nakajiでもわかるC# No.{i}" }); // 1件ずつデータベースへ保存する db.SaveChanges(); } sw.Stop(); Console.WriteLine(sw.Elapsed.TotalMilliseconds); } using (var db = new DatabaseContext(optionsBuilder.Options)) { var book = db.Books.FirstOrDefault(x => x.Title.Contains("No.459")); Console.WriteLine(book.Title); Console.ReadLine(); } }
使い所
ぱっと思いついたのはデータベースを使用するユニットテスト。SQL Serverなど使ってるとそれなりに遅いのでテストを実行する気が薄れてきたりしますが、これなら大丈夫かも。
Core 1.0でも基本的な使い方は大きく変わって無さそうだし、 個人でゴニョゴニョしてるプロジェクトにはそろそろ適用してもいい気がしてきました。
とはいうものの、その前にマイグレーションの仕方とか、Code Firstの仕方がよくわかってないので調べないといけませんけどね。
おしまい。