今回はコードファーストを使ってデータベースのテーブルを作って行きたいと思います。コードファーストとは、モデルクラスを作ってコマンドをたたくだけでデータベーステーブルを作ってくれるんです。すごい便利ですよね~。まずモデルクラスを作って行きます。出来るだけ簡単に、「Book」と「BookCategoy」というモデルを作ります。BookCategoryは本のカテゴリーを登録しようかなと思って。マスターテーブルですね。めんどくさいので至極簡単なデータベース設計です。
BookCategoryクラス
[Table("BookCategory")]
public class ModelBookCategory
{
[Key]
public int CategoryID { get; set; }
[StringLength(100)]
public string CategoryName { get; set; } = string.Empty;
public DateTime CreateDate { get; set; } = DateTime.Now;
}
Tableと書いてある所が実際のテーブル名になります。キーには[Key]と付けます。StringLengthを指定すると文字列の最大値を指定することが出来ます。指定しないと無制限になるみたいです。必須にしたい場合は、[Required]と付けます。
Bookクラス
[Table("Book")]
public class ModelBook
{
[Key]
public int BookID{ get; set; }
[StringLength(100)]
public string BookName { get; set; } = string.Empty;
public ModelBookCategory? Category { get; set; }
}
ここで本のデータを格納するBookクラスを作成しますが、子テーブルのBookCategoryクラスをこのように書けます。ここすごいポイントなので覚えておいてくださいね。マスターテーブルの情報をこうやって持ってこれるってめちゃ便利って思うじゃないですか^^;多いときには1テーブルに対してマスターテーブルの情報が6つくらい入ってたりしませんか?そしてここではもう1つモデルクラスを作っておきます。
Book2クラス
[Table("Book2")]
public class ModelBook2
{
[Key]
public int Book2ID { get; set; }
[StringLength(100)]
public string BookName { get; set; } = string.Empty;
public int CategoryID { get; set; }
}
Book2クラスでは、BookCategoryテーブルの情報をキーであるIDのみにしました。これもポイントです。後で説明するので今はこれで進めていきます。
次にDbContextというクラスから派生させたコンテキストクラスを作り以下のように書きます。
public class TestDBContext : DbContext
{
public DbSet<ModelBook> Books { get; set; }
public DbSet<ModelBook2> Book2s { get; set; }
public DbSet<ModelBookCategory> BookCategorys { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(
@"Server=(localdb)\mssqllocaldb;Database=testdb;Trusted_Connection=True");
}
}
ここのDatabase=testdb;には作成したデータベース名を設定してください。
ここまで出来たら「ツール」→「NuGetパッケージマネージャー」→「パッケージマネージャーコンソール」を選択して、「パッケージマネージャーコンソール」を表示させます。そこで、「Add-Migration Initial」とコマンドを入力します。

あれ~、失敗してるやん^^;以前これですごいハマってデータベース自体消して最初からやり直しちゃったりしたことがあります。実はこれワザとで、ソリューション全体でビルドエラーが起きた時に出るようです。今ワザとビルドエラーを起こしてます。

データベース周りでないところのビルドエラーでも駄目なので、気を付けてくださいね。再ビルドしたら出来ました。そして次にUpdate-Databaseと入力します。
データベースを見てみるとテーブルが出来ていました。

まずBookテーブルの中身は

これに対してBook2テーブルの中身は

子テーブルをクラスごと入れるとインデックスと外部キーが付くようです。