Entity Framework(Core)
についての概要を学ぼう
株式会社SAKURUG
エンジニアリングユニット
草場 友光
.NET ラボ 2022年4月
自己紹介
• 普段は主にWebFormsアプリ
の保守のお仕事をしてます。
• 古めのシステムが多いので時
代に取り残されぬよう新しい技
術を一つでも入れるよう日々努
力しています。
• tomo_kusaba
宣伝
【VISION】ひとの可能性を開花させる企業であり続ける
VISIONに共感できる仲間募集中。
注意
• 個人の見解・解釈が多分に入っています。
• 見解の相違・事実誤認などありましたらご指摘ください。
• #dotnetlabでtweetすると右側に表示されます
今日の目的
• Entity Framework(Core)について触ったことない方、これか
ら使っていこうという方向けに概要を説明したい
• Entity Framework CoreでCRUDができるようになる
主なトピック
• いにしえの重厚なEntity Frameworkを見てみよう!
• Entity Framework CoreでCRUDしてみよう!
• Code-Firstとは? DB-Firstとは?
Entity Framework(Core)とは?
• Entity Framework Core(EF Core)は.NET用の最新のオブジェ
クトデータベースマッパー
• LINQクエリ、変更の追跡、更新、スキーマの移行がサポート
• EF CoreはSQL ServerやCosmosDB、MySQL、Oracle、
PostgreSQLなど多くのデータベースと連携
• Entity Framework6は.NET Framework向けに設計されたオブ
ジェクトリレーショナルマッパー
• .NET Coreもサポートしている
どちらを使ったら?
• .NETベースの新規開発ならEF Core
• 既存アプリケーションで進化したり新しい機能が必要になる可
能性が低い場合はEF6を引き続き使用
• EF Coreでのみ使用できる新機能を必要とする場合はEF Core
に移植
Entity FrameworkでCRUD
• https://sakurug.connpass.com/event/138370/
こちらのハンズオンの手
順を振り返ってみよう
手順概要
• ASP.NET MVC 個別の認証でプロジェクト作成
• プロジェクトをそのまま実行しアカウント登録実施(LocalDB
にデータを投入する)
• ModelフォルダにADO.NET Entity Data Modelをデータベー
スからEF DesignerでLocalDBをデータソースに作成
• 一旦、ビルドする
• Controllerフォルダに新規スキャフォルディングアイテムを追
加(Entity Frameworkを使用したビューがあるMVC5コント
ローラ)
Entity Frameworkの特徴
✓ EF Designerがある
✓ データベースからモデルを作成するVSウィザードがある
Entity Framework Coreの特徴
• CosmosDBなど新しいデータベースに対応
• Null許容参照型に対応
• 何よりも、積極的に改善が続けれられている!
主な対応データベース
Nugetパッケージ サポートされて
るDBエンジン
メンテナンス ビルドバージョン
Microsoft.EntityFrameworkCore.SqlServer SQL Server 2012以降 EF Coreプロジェクト 6.0
Microsoft.EntityFrameworkCore.Sqlite SQLite3.7以降 EF Coreプロジェクト 6.0
Microsoft.EntityFrameworkCore.InMemory EF Core InMemoryデータ
ベース
EF Coreプロジェクト 6.0
Microsoft.EntityFrameworkCore.Cosmos Azure CosmosDB SQLAPI EF Coreプロジェクト 6.0
Npgsql.EntityFrameworkCore.PostgreSQL PostgreSQL Npgsql開発プロジェクト 6.0
Pomelo.EntityFrameworkCore.MySql MySQL,MariaDB Pomelo Foundationプロジェクト 6.0
MySql.EntityFrameworkCore.MySql MySQL MySQLプロジェクト(Oracle) 6.0
Oracle.EntityFrameworkCore OracleDB 11.2以降 Oracle 6.0
Code Firstとは?
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
…
}
public class Blog
{
public int Id { get; set; }
public string Name { get; set; }
public IList<Post> Posts { get; } = new List<Post>();
}
public class Post
{
public int Id { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public int? BlogId { get; set; }
public Blog Blog { get; set; }
}
テーブル作成
データベースの作成
.NET Core CLI Visual Studio
データモデルの移行を
作成
dotnet ef migrations add [移行
名]
Add-Migration [移行名]
データベースにスキー
マを作成
dotnet ef database update Update-Database
DB Firstとは?
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
…
}
public class Blog
{
public int Id { get; set; }
public string Name { get; set; }
public IList<Post> Posts { get; } = new List<Post>();
}
public class Post
{
public int Id { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public int? BlogId { get; set; }
public Blog Blog { get; set; }
}
既存テーブル
モデルの作成
前提:Microsoft.EntityFrameworkCore.Designパッケージを追加でNuget
dotnet ef dbcontext scaffold "Data Source=(localdb)¥MSSQLLocalDB;Initial Catalog=Chinook" Microsoft.EntityFrameworkCore.SqlServer
.NET Core CLI
Scaffold-DbContext 'Data Source=(localdb)¥MSSQLLocalDB;Initial Catalog=Chinook' Microsoft.EntityFrameworkCore.SqlServer
Visual Studio
接続文字列 プロバイダ名
選択の方法
• LINQを使用してデータベースに問い合わせます
• EF CoreがLINQクエリの表現をデータベース固有のクエリ言
語(SQLなど)に変換して問い合わせをします。
using (var context = new BloggingContext())
{
var blogs = context.Blogs
.Where(b => b.Url.Contains("dotnet"))
.ToList();
}
挿入の方法
• データベースに新しいデータを追加するにはDbSet.Addメソッ
ドを使用します。
• SaveChangesメソッドが呼び出されたときにデータベースに
挿入されます。
using (var context = new BloggingContext())
{
var blog = new Blog { Url = "http://example.com" };
context.Blogs.Add(blog);
context.SaveChanges();
}
更新の方法
• データベースから読み込まれたエンティティを変更します。
• SaveChangesメソッドを呼び出します。
using (var context = new BloggingContext())
{
var blog = context.Blogs.Where(x => x.Url == “http://example.com”).Single();
blog.Url = "http://example.com/blog";
context.SaveChanges();
}
削除の方法
• データを削除するにはDbSet.Removeメソッドを使用します。
using (var context = new BloggingContext())
{
var blog = context.Blogs.Where(x => x.Url == “http://example.com/blog”).Single();
context.Blogs.Remove(blog);
context.SaveChanges();
}
発行されたSQLを見るためには
• DbContext.OnConfiguringのオーバライドで
optionsBuilder.LogToメソッドを使用する。
• 例えば、コンソールに出力する例
• SQLだけではなくEFによる操作が出力される
• ロガーカテゴリを構成することによりSQLのみを出力することも可
能
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder.LogTo(Console.WriteLine);
https://docs.microsoft.com/ja-jp/ef/core/logging-events-diagnostics/simple-logging
おしまい
おしまい

Entity Framework(Core)についての概要を学ぼう