2016-12-24 42 views
5

私は以下のように2つの単純なPOCOクラスを持って、EF 6を使用しています:Entity Frameworkのテーブル名規則

public class Person 
{ 
    public int PersonId { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

public class Company 
{ 
    public int CompanyId { get; set; } 
    public string Name { get; set; } 
} 

と私のコンテキスト

public class Context : DbContext 
{ 
    public Context() : base("name=codefirst") 
    { 

    } 
    public DbSet<Person> People { get; set; } 
    public DbSet<Company> Corporation { get; set; } 
} 

そして、EFは、テーブルを生成: dbo.Companiesをdbo.People

私の質問がありますなぜ1つのテーブル名はPeopleであり、他のテーブル名はCompanies(なぜ私は複数形であるのか分かります)です。 つまり、1つのテーブルはプロパティ名を使用し、もう1つのテーブルはクラス名を使用しますか?

ありがとうございます!

enter image description here

+0

どちらも型名を使用していますが、複数形になっています。 「Person」の複数形は「People」 – haim770

答えて

4

の両方が彼らのクラス名を使用してマッピングされます。
恐らくあなたを混乱させるものは、Personクラスのマッピングです。人は複数形(複数の人を意味する)であるため、EFの複数化規則の1つであり、EFはそれを人としてマッピングします。一方、会社クラスをCompanyとしてマッピングしました。あなたがそれを好きではない場合は、OnModelCreating()方法でこのコードを追加することにより、EFの複数形の規則をオフにすることができ

:ながら

modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

+0

OPは、テーブルを作成している間にEFが複数形化をしていることを知っています。 – RBT

+0

@RBTはい、彼はPersonクラスがPersonとしてマップされることを期待していました。私はそれがないと説明した。ありがとう。 – Gimballock

+0

今は明らかです。 –

1

Entity Frameworkの(EF)モデルビルダーは、常にあなたのクラス名を指し、データベースにテーブルを作成し、コードで最初にアプローチします。あなたの場合はPersonCompanyです。 EFは、データベーステーブルの作成時にコンテキストクラスのプロパティを参照することはありません。

テーブルを作成するが、それは名前そうPersonPeopleに複数形だとCompanyCompaniesへの複数形だと複数形しようとします。

Companyクラスの名前をCorporationに変更した場合のように、テーブル名はCorporationsとして作成されます。私も、私はそれをテストするために何をしたかである。ここFooBar

にコンテキストクラスに対応するプロパティ名Corporationを変更しました:

public class Person 
{ 
    public int PersonId { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 
public class Corporation 
{ 
    public int CorporationId { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

public class Context : DbContext 
{ 
    public Context() : base("name=codefirst") 
    { 

    } 
    public DbSet<Person> People { get; set; } 
    public DbSet<Corporation> FooBar { get; set; } 
} 

EFは今、先に行くと(Corporationの複数)の代わりにCorporationsテーブルを作成し、コンテクストクラスに存在するFooBarプロパティ名はすべて無視されます。

コードでは、Personの複数形になるPeopleという名前のコンテクストクラスにプロパティを指定したことは単なる偶然の一致です。これはあなたを混乱させ、あなたに考えさせました。