はじめに
SQLをバリバリ操作してのシステム開発しか経験がなく、EntityFrameworkのモデルファーストでデータベースを定義していく方法に慣れないため、整理しておく。
Parentテーブルの1レコードに対して、Childテーブルの複数レコードが関連している場合は、それぞれ以下の通りモデルを定義することで、自動的に関連付けされる。
なお、今回は必ず紐づけできるという前提であるが、それぞれNull許容することも可能。
1対1の関係
1対1はシンプルに定義することができる。
[Parent]クラス
子テーブルのクラスオブジェクトを定義する。
public class Parent
{
public int Id { get; set; }
public string Name { get; set; }
public Child Child { get; set; }
}
[Child]クラス
「親テーブルの名称+Id」の変数と、親テーブルのクラスオブジェクトを定義する。
public class Child
{
public int Id { get; set; }
public string Name { get; set; }
public int ParentId { get; set; }
public Parent Parent { get; set; }
}
1対多の関係
1対多もシンプルに定義することができる。
[Parent]クラス
子テーブルのクラスオブジェクトを定義する。ただし、子テーブルは複数取得される可能性があるため、ここではリストとして定義する必要がある。
public class Parent
{
public int Id { get; set; }
public string Name { get; set; }
public List<Child> Child { get; } = [];
}
[Child]クラス
「親テーブルの名称+Id」の変数と、親テーブルのクラスオブジェクトを定義する。
public class Child
{
public int Id { get; set; }
public string Name { get; set; }
public int ParentId { get; set; }
public Parent Parent { get; set; }
}
多対多の関係
多対多は少し追加の定義が必要となる。
というのも、多対多は2つのテーブル定義だけでは完結しなくなるからであり、もし手動でこの関係を定義しようと思うと、ParentテーブルとChildテーブルを繋ぐ中間テーブルが必要となる。
EntiryFrameworkでは追加の定義部分で、その部分を自動的に作成することができる。
[Parent]クラス
子テーブルのクラスオブジェクトを定義する。ただし、子テーブルは複数取得される可能性があるため、ここではリストとして定義する必要がある。
public class Parent
{
public int Id { get; set; }
public string Name { get; set; }
public List<Child> Child { get; } = [];
}
[Child]クラス
「親テーブルの名称+Id」の変数と、親テーブルのクラスオブジェクトを定義する。
public class Child
{
public int Id { get; set; }
public string Name { get; set; }
public List<Parent> Parent { get; } = [];
}
[ParentChild]クラス
明示的に定義をしなくても動作するが、ParentChildに対して直接インサートするために定義する。
public class ParentChild
{
public int ParentId { get; set; }
public int ChildId { get; set; }
}
[DBContext]クラス
public class AppDbContext : DbContext
{
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
public DbSet<Parent> Parents { get; set; }
public DbSet<Child> Children { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Child>()
.HasMany(e => e.Parent)
.WithMany(e => e.Child)
.UsingEntity<AreaSouvenir>();
}
}