0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

EntityFrameworkの外部キー

Last updated at Posted at 2024-09-25

はじめに

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>();
    }
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?