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; }
}
この場合だと、User
とCompanys
のクラスが単数形に、
UserDetail
とCompanyDetails
のクラスが複数形になる。
カラム名(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のプロパティを考えなしに実装した結果、CompanyId
とCompanysId
の両方がテーブルに実装されてしまった。
参考
EntityFrameworkCore シャドウ プロパティ
EntityFrameworkCore リレーションシップ