LoginSignup
0
0

More than 3 years have passed since last update.

EntityFrameworkCoreでMigrationsしたときのテーブル名や定義名

Last updated at Posted at 2019-11-24

EntityFrameworkCoreで、業務で何も考えずに名前を決めたせいで外部キー(以下、「FK」)で困ったので、テーブル名や定義名がどう設定されるのか確認した。

  • 確認環境
    • SQL Server 14.0
    • .net core 2.2
    • EntityFrameworkCore 2.2

テーブル名

結論
DbContextクラスのプロパティ名がそのままテーブル名になる

CorporateDbContext.cs
public class CorporateDbContext : DbContext
{
    public CorporateDbContext() { }
    public CorporateDbContext(DbContextOptions<ApplicationCommandDbContext> options)
        : base(options)
    {
    }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
    }
    public DbSet<User> User { get; set; }
    public DbSet<UserDetail> UserDetails { get; set; }
    public DbSet<Companys> Company { get; set; }
    public DbSet<CompanyDetails> CompanyDetails { get; set; }
}

この場合だと、UserCompanysのクラスが単数形に、
UserDetailCompanyDetailsのクラスが複数形になる。

カラム名(FK)

結論
クラス名+"Id"で自動生成される

Companys.cs
public class Companys
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<CompanyDetail> CompanyDetail { get; set; }
}
CompanyDetail.cs
public class CompanyDetail
{
    public Guid Id { get; set; }
    public string DetailKey { get; set; }
    public string DetailValue { get; set; }
}

上記のように親テーブルから子テーブルに対してプロパティを実装した場合、EntityFrameworkCoreではシャドウプロパティとしてFKが自動的に設定され、テーブルにも実装される。
上の場合だと、データベースのCompanyDetailテーブルにはCompanysIdのカラムが実装される。

最後に

クラスやプロパティの命名は昔からきちんと決めることが大事と言われていたけど、それを痛感した。
私がやってしまったのはFKのほうで、明示的にFKのプロパティを考えなしに実装した結果、CompanyIdCompanysIdの両方がテーブルに実装されてしまった。

参考

EntityFrameworkCore シャドウ プロパティ
EntityFrameworkCore リレーションシップ

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