EntityFrameworkCoreで、業務で何も考えずに名前を決めたせいで外部キー(以下、「FK」)で困ったので、テーブル名や定義名がどう設定されるのか確認した。
- 確認環境
- SQL Server 14.0
- .net core 2.2
- EntityFrameworkCore 2.2
テーブル名
結論
DbContextクラスのプロパティ名がそのままテーブル名になる
CorporateDbContext.cs
publicclassCorporateDbContext:DbContext{publicCorporateDbContext(){}publicCorporateDbContext(DbContextOptions<ApplicationCommandDbContext>options):base(options){}protectedoverridevoidOnModelCreating(ModelBuildermodelBuilder){}publicDbSet<User>User{get;set;}publicDbSet<UserDetail>UserDetails{get;set;}publicDbSet<Companys>Company{get;set;}publicDbSet<CompanyDetails>CompanyDetails{get;set;}}
この場合だと、User
とCompanys
のクラスが単数形に、UserDetail
とCompanyDetails
のクラスが複数形になる。
カラム名(FK)
結論
クラス名+"Id"で自動生成される
Companys.cs
publicclassCompanys{publicGuidId{get;set;}publicstringName{get;set;}publicvirtualICollection<CompanyDetail>CompanyDetail{get;set;}}
CompanyDetail.cs
publicclassCompanyDetail{publicGuidId{get;set;}publicstringDetailKey{get;set;}publicstringDetailValue{get;set;}}
上記のように親テーブルから子テーブルに対してプロパティを実装した場合、EntityFrameworkCoreではシャドウプロパティとしてFKが自動的に設定され、テーブルにも実装される。
上の場合だと、データベースのCompanyDetailテーブルにはCompanysId
のカラムが実装される。
最後に
クラスやプロパティの命名は昔からきちんと決めることが大事と言われていたけど、それを痛感した。
私がやってしまったのはFKのほうで、明示的にFKのプロパティを考えなしに実装した結果、CompanyId
とCompanysId
の両方がテーブルに実装されてしまった。