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. 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
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. 作成したテストを実行する
DB Browser for SQLでレコードが挿入されているのを確認
する
20Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10
テストの実施
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
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. 修正したテストを実行する
DB Browser for SQLでレコードが挿入されているのを確認
する
レコードを削除しているので、UserIdが新しくなっている
26Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10
テストの実施
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. 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. 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. 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
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. 追加したテストを単体で実行する
DB Browser for SQLでレコードが挿入されているのを確認
する
35Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10
テストの実施
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. 追加したテストを単体で実行する
DB Browser for SQLでレコードが挿入されているのを確認
する
37Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10
テストの実施
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. 追加したテストを単体で実行する
DB Browser for SQLでレコードが更新されているのを確認
する
39Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10
テストの実施
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. 追加したテストを単体で実行する
DB Browser for SQLでレコードが削除されているのを確認
する
41Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10
テストの実施
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. 追加したテストを単体で実行する
DB Browser for SQLでレコードが削除されているのを確認
する
Userを消しただけだが、KptBoardも一緒に消える
43Copyright (c) 2017 Eiwa System Management, Inc.2017/3/10
テストの実施