0

私はEF Fluent APIを学びます。エンティティフレームワークFluent API - 命名規則に基づいてforgeinキーを作成します

私は2つのシンプルなPOCOクラスを持っています。

public class Customer 
{ 
    public int CustomerId{ get; set;} 
    public string Name{ get; set;} 
} 

public class Project 
{ 
    public int ProjectId { get; set; } 
    public int CustomerId { get; set; } 
    public string Name { get; set; } 
    public Customer Customer { get; set; } 
} 

コンテキストクラス

public class MyCtx:DbContext 
    { 
     public DbSet<Project> Projects { get; set; } 
     public DbSet<Customer> Authors { get; set; } 

     public MyCtx(string connString):base(connString) 
     {} 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      //PK 
      modelBuilder.Entity<Project>() 
       .HasKey(p => p.ProjectId) 
       .Property(p => p.ProjectId) 
       .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity) 
       .HasColumnName("PROJECT_ID") 
       .IsRequired(); 


      modelBuilder.Entity<Project>() 
       .Property(c => c.Name) 
       .HasColumnName("NAME") 
       .IsRequired(); 

      //-------------------------------------------------------------------- 

      //PK 
      modelBuilder.Entity<Customer>() 
       .HasKey(c => c.CustomerId) 
       .Property(c => c.CustomerId) 
       .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity) 
       .HasColumnName("CUSTOMER_ID") 
       .IsRequired(); 

      modelBuilder.Entity<Customer>() 
       .Property(c => c.Name) 
       .HasColumnName("NAME") 
       .IsRequired(); 

      base.OnModelCreating(modelBuilder); 
     } 
    } 

私はCustomerIdのは、テーブルの顧客の主キーとなり、PROJECTIDは、プロジェクトテーブルの主キーになることを定義しました。

私はこの動作に少し驚いています。プロジェクトテーブルのCustomerIdは自動的に外部キーです。

この動作は命名規則に基づいていますか?またはそれはどのように機能するのですか?

答えて

0

はい、それは命名規則に基づいており、この場合、具体的NavigationPropertyNameForeignKeyDiscoveryConvention:名前に依存ナビゲーションプロパティ名の 組み合わせ(カスタマーある外部キーのプロパティを発見する

条約あなたの場合) プリンシパルタイプ主キーのプロパティ名(お客様の場合は)。

それともPrimaryKeyNameForeignKeyDiscoveryConventionです:名前 主なタイプの主キープロパティ名(複数可)と一致する外部キーの性質を発見する

条約。

どちらが正しいかわかりません。

あなたがモデルビルダーでそれらを削除することができ、これらの規則のいずれかを好きではない場合は、次のすべての規則の

modelBuilder.Conventions 
    .Remove<NavigationPropertyNameForeignKeyDiscoveryConvention>(); 
// etc. 

完全なリストはhereです。

+0

ありがとうございました。 –