Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

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

3 040 vues

Publié le

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

Publié dans : Logiciels
  • Hello! Get Your Professional Job-Winning Resume Here - Check our website! https://vk.cc/818RFv
       Répondre 
    Voulez-vous vraiment ?  Oui  Non
    Votre message apparaîtra ici

「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 テストの実施

×