Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

「Entity Framework Coreを使ってみる」 公開用

2,692 views

Published on

C#とSQLiteでEntity Framework Coreを使ってみました。
2017/3/8 ミスがあったので修正。
2017/3/10 謝辞を追加。

Published in: Software
  • Hello! Get Your Professional Job-Winning Resume Here - Check our website! https://vk.cc/818RFv
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

「Entity Framework Coreを使ってみる」 公開用

  1. 1. Entity Framework Coreを使ってみる Core 1.1.0/SQLite編 2017/3/10 1Copyright (c) 2017 Eiwa System Management, Inc. 株式会社永和システムマネジメント コンサルティングセンター センター長 天野勝 http://www.esm.co.jp/service/consulting/
  2. 2.  作成アプリケーション  KPTボード  動作確認環境  対象:Entity Framework Core 1.1.0  OS:Windows10 64bit  IDE:Visual Studio 2015 Community  RDBMS:SQLite3  EntityFramework Core SQLiteをインストールする際にインストールされる  DB操作ツール:DB Browser for SQLite 2Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10 概要
  3. 3.  以下のサイトを参考にさせていただきました。  ありがとうございます。  Logging | Microsoft Docs https://docs.microsoft.com/en-us/ef/core/miscellaneous/logging  Part 2. Entity Framework Core 1.0 の基本的な使い方 – とあるコン サルタントのつぶやき https://blogs.msdn.microsoft.com/nakama/2016/07/07/aspnetcore10-part2/  Entity Framework Core 1.0 で SQLite を使ってみる - ROMANCE DAWN for the new world http://gooner.hateblo.jp/entry/2016/03/04/071400 3Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10 謝辞
  4. 4. プロジェクトの作成 2017/3/10 4Copyright (c) 2017 Eiwa System Management, Inc.
  5. 5.  クラスライブラリ  プロジェクト名「KptBoardSystem」  「Microsoft.EntityframeworkCore.Sqlite」 「Microsoft.EntityframewordCore.Tools」をNuGetでインス トール 5Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10 Modelプロジェクトの作成
  6. 6.  クラスライブラリ  プロジェクト名「KptBoardSystemTest」  「Microsoft.EntityframeworkCore」「xunit」 「xunit.runner.visualstudio」「Moq」をNuGetでインストール 6Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10 テストプロジェクトの作成
  7. 7. インストール 2017/3/10 7Copyright (c) 2017 Eiwa System Management, Inc.
  8. 8.  「Microsoft.EntityframeworkCore.Sqlite」をインストール 8Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10 NuGetでインストール
  9. 9.  「Microsoft.EntityframeworkCore.Tools」をインストール  インストールすると、マイグレーション機能が使えるようになる 9Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10 NuGetでインストール
  10. 10.  インストール時にセキュリティエラーが出るのは、スクリプト 実行権限がないため。  Visual Studioを管理者権限で実行して、再度インストールす る。 10Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10 NuGetでインストール
  11. 11. データモデルとテーブルの作成 2017/3/10 11Copyright (c) 2017 Eiwa System Management, Inc.
  12. 12. 12Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10 Userクラスの作成 using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace KptBoardSystem { [Table("Users")] // テーブル名をクラス名の複数形に指定 public class User { public int UserId { get; set; } [Required] // Nameフィールドは必須 public string Name { get; set; } } } User.cs
  13. 13. 13Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10 KptBoardModelクラスの作成 using Microsoft.Data.Sqlite; using Microsoft.EntityFrameworkCore; namespace KptBoardSystem { public class KptBoardModel : DbContext { public DbSet<User> Users { get; internal set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { var connectionString = new SqliteConnectionStringBuilder { DataSource = "../../../kpt.db" }.ToString(); optionsBuilder.UseSqlite(new SqliteConnection(connectionString)); } } } KptBoardModel.cs
  14. 14.  パッケージマネージャコンソールにて、コマンドを実行する  > Enable-Migrations  マイグレーションができるようにする  パスに日本語が含まれていたり、スタートアッププロジェクトに設定していないとエ ラーになる  > Add-Migration step00  マイグレーション用のコード「XXX_step00.cs」が作成される 14Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10 マイグレーションの準備
  15. 15.  パッケージマネージャコンソールにて、コマンドを実行する  > Update-Database  ソリューションの直下に「kpt.db」が作成される 15Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10 マイグレーションの実施
  16. 16.  DB Browser for SQLiteにて「kpt.db」を開く  「Users」テーブルが作成できていることを確認 16Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10 データベースの確認
  17. 17. テストからのレコード作成 2017/3/10 17Copyright (c) 2017 Eiwa System Management, Inc.
  18. 18.  KptBoardSystemTestプロジェクトで[参照の追加]  [プロジェクト]>[KptBoardSystem]をチェックして[OK] 18Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10 テスト対象の参照設定をする
  19. 19. 19Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10 テストコードの作成 using Xunit; namespace KptBoardSystem.Test // Testの前に「.」を追加する { public class KptBoardModelTest { [Fact] public void TestInsertUser() { using (var db = new KptBoardModel()) { var user = new User { Name = "User01" }; db.Add(user); db.SaveChanges(); } } } } KptBoardModelTest.cs
  20. 20.  作成したテストを実行する  DB Browser for SQLでレコードが挿入されているのを確認 する 20Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10 テストの実施
  21. 21. データモデルの変更と マイグレーション 2017/3/10 21Copyright (c) 2017 Eiwa System Management, Inc.
  22. 22. 22Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10 Userクラスの修正 using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace KptBoardSystem { [Table("Users")] public class User { public int UserId { get; set; } [Required] public string Name { get; set; } public int? Age { get; set; } // プロパティを追加。nullも可能な「int?」型にする } } User.cs
  23. 23.  パッケージマネージャコンソールにて、コマンドを実行する  > Add-Migration step01  マイグレーション用のコード「XXX_step01.cs」が作成される 23Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10 マイグレーションの準備
  24. 24.  パッケージマネージャコンソールにて、コマンドを実行する  > Update-Database  「Users」テーブルに列が追加される  「Age」列が追加されたのを確認する 24Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10 マイグレーションの実行
  25. 25. 25Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10 テストコードの修正 using Xunit; using System.Linq; namespace KptBoardSystem.Test { public class KptBoardModelTest { [Fact] public void TestInsertUser() { using (var db = new KptBoardModel()) { // 全レコードを削除 foreach (var u in db.Users.ToArray()) { db.Remove<User>(u); } db.Add(new User { Name = "User01" }); db.Add(new User { Name = "User02", Age = 2 }); db.SaveChanges(); } } } } KptBoardModelTest.cs
  26. 26.  修正したテストを実行する  DB Browser for SQLでレコードが挿入されているのを確認 する  レコードを削除しているので、UserIdが新しくなっている 26Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10 テストの実施
  27. 27. 関連テーブル 2017/3/10 27Copyright (c) 2017 Eiwa System Management, Inc.
  28. 28. 28Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10 クラス図 KptBoardModel <<Table("Users")>> + <<get, set>> KptBoards : List<KptBoard> + AddKptBoard(kptBoard : int) : KptBoard + <<get, set>> UserId : int + <<get, set>> Age : int + <<get, set>> Name : string User <<Table("KptBoards")>> + <<get, set>> UserId : int + <<get, set>> KptBoardId : int + <<get, set>> Problem : string + <<get, set>> Try : string + <<get, set>> Keep : string + <<get, set>> Time : DateTime KptBoard - _kptBoards 0..*1
  29. 29. 29Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10 KptBoardクラスを追加 using System; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace KptBoardSystem { [Table("KptBards")] // テーブル名をクラス名の複数形に指定 public class KptBoard { public int KptBoardId { get; set; } [Required] public DateTime Time { get; set; } public string Keep { get; set; } public string Problem { get; set; } public string Try { get; set; } public int UserId { get; set; } // 外部キーとして、UserクラスのUserIdと同じ名称を指定 } } KptBoard.cs
  30. 30. 30Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10 Userクラスを修正 using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace KptBoardSystem { [Table("Users")] public class User { private List<KptBoard> _kptBoards = new List<KptBoard>(); //KptBoardを複数持てるようにListを使用 public int UserId { get; set; } [Required] public string Name { get; set; } public int? Age { get; set; } public List<KptBoard> KptBoards { get { return _kptBoards; } set { _kptBoards = value; } } public void AddKptBoard(KptBoard kptBoard) { _kptBoards.Add(kptBoard); } } } User.cs
  31. 31. 31Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10 KptBoardModelクラスを修正 using Microsoft.Data.Sqlite; using Microsoft.EntityFrameworkCore; namespace KptBoardSystem { public class KptBoardModel : DbContext { public DbSet<User> Users { get; internal set; } public DbSet<KptBoard> KptBoards { get; internal set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { var connectionString = new SqliteConnectionStringBuilder { DataSource = "../../../kpt.db" }.ToString(); optionsBuilder.UseSqlite(new SqliteConnection(connectionString)); } } } KptBoardModel.cs
  32. 32.  パッケージマネージャコンソールにて、コマンドを実行する  > Add-Migration step02  マイグレーション用のコード「XXX_step02.cs」が作成される 32Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10 マイグレーションの準備
  33. 33.  パッケージマネージャコンソールにて、コマンドを実行する  > Update-Database  「KptBoards」テーブルが追加される 33Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10 マイグレーションの実行
  34. 34. 34Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10 テストメソッドを追加 using Xunit; using System; using System.Linq; using Microsoft.EntityFrameworkCore; namespace KptBoardSystem.Test { public class KptBoardModelTest { [Fact(DisplayName = "既存のユーザーにKptBoardを追加する")] public void TestInsertKptBoard() { using (var db = new KptBoardModel()) { var user02 = db.Users.Where((u) => u.Name == "User02").Include("KptBoards").First(); user02.AddKptBoard(new KptBoard { Time = DateTime.Now, Keep = "続けること", Problem = "不満なこと", Try = "Tryは次に試すこと。" }); db.Update(user02); // 更新 db.SaveChanges(); } } [Fact] public void TestInsertUser() KptBoardModelTest.cs
  35. 35.  追加したテストを単体で実行する  DB Browser for SQLでレコードが挿入されているのを確認 する 35Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10 テストの実施
  36. 36. 36Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10 テストメソッドを追加 using Xunit; using System; using System.Linq; using Microsoft.EntityFrameworkCore; namespace KptBoardSystem.Test { public class KptBoardModelTest { [Fact(DisplayName = "新規にユーザーとKptBoardを追加する")] public void TestInsertUserAndKptBoard() { using (var db = new KptBoardModel()) { var user = new User // Userが1つ、KptBoardが3つのインスタンスを作り上げる { Name = "User03", Age = 3, KptBoards = { new KptBoard { Time = DateTime.Now, Keep = "続けることだけ" }, new KptBoard { Time = DateTime.Now, Problem = "続けることだけ" }, new KptBoard { Time = DateTime.Now, Try = "試すことだけ" }, } }; db.Add(user); // 追加 db.SaveChanges(); } } KptBoardModelTest.cs
  37. 37.  追加したテストを単体で実行する  DB Browser for SQLでレコードが挿入されているのを確認 する 37Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10 テストの実施
  38. 38. 38Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10 テストメソッドを追加 using Xunit; using System; using System.Linq; using Microsoft.EntityFrameworkCore; namespace KptBoardSystem.Test { public class KptBoardModelTest { [Fact(DisplayName = "KptBoardを修正する")] public void TestUpdateKptBoard() { using (var db = new KptBoardModel()) { var kptBoard = db.KptBoards.Where(b => b.Problem.Contains("続ける")).First(); kptBoard.Problem = "問題だけ"; db.Update(kptBoard); // 更新 db.SaveChanges(); } } KptBoardModelTest.cs
  39. 39.  追加したテストを単体で実行する  DB Browser for SQLでレコードが更新されているのを確認 する 39Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10 テストの実施
  40. 40. 40Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10 テストメソッドを追加 using Xunit; using System; using System.Linq; using Microsoft.EntityFrameworkCore; namespace KptBoardModel.Test { public class KptBoardModelTest { [Fact(DisplayName = "KptBoardを削除する")] public void TestDeleteKptBoard() { using (var db = new KptBoardModel()) { var kptBoard = db.KptBoards.Where(b => b.Problem == "問題だけ").First(); db.Remove(kptBoard); // 削除 db.SaveChanges(); } } KptBoardModelTest.cs
  41. 41.  追加したテストを単体で実行する  DB Browser for SQLでレコードが削除されているのを確認 する 41Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10 テストの実施
  42. 42. 42Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10 テストメソッドを追加 using Xunit; using System; using System.Linq; using Microsoft.EntityFrameworkCore; namespace KptBoardModel.Test { public class KptBoardModelTest { [Fact(DisplayName = "KptBoardを持っているUserを削除する")] public void TestDeleteUserHasKptBoard() { using (var db = new KptBoardModel()) { // Includeしていないので、Userの情報しか取れない var user = db.Users.Where((u) => u.Name == "User03").First(); db.Remove(user); // 削除 db.SaveChanges(); } } KptBoardModelTest.cs
  43. 43.  追加したテストを単体で実行する  DB Browser for SQLでレコードが削除されているのを確認 する  Userを消しただけだが、KptBoardも一緒に消える 43Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10 テストの実施

×