2016-12-24 160 views
5

我使用EF 6,有如下兩個簡單的POCO類:實體框架表名約定

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 and dbo.People

我的問題是爲什麼一個表名是People和其他表名是Companies(我知道爲什麼是複數)。 我的意思是,一個表使用屬性名稱,另一個表使用類名?

在此先感謝!

enter image description here

+0

兩者都使用類型名稱,只有它們是複數形式。 「人」的複數是'人' – haim770

回答

4

兩者都使用他們的類名映射。
可能使您感到困惑的是Person類的映射。這是EF多元化規則之一,因爲人是複數形式的人(意味着不只一個人),EF將其映射爲人。另一方面,它簡單地將公司類映射爲公​​司。

您可以通過在OnModelCreating()方法添加此代碼關閉EF多元化約定,如果你不喜歡它:

modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

+0

OP知道EF在創建表格時做了複數化處理,他不想阻止它發生。 – RBT

+0

@RBT是的,但他期待Person類被映射爲Persons。我解釋說它不會。 – Gimballock

+0

謝謝。現在很清楚。 –

1

實體框架(EF)模型構造器總是指的是你的類名,而以代碼優先的方式在數據庫中創建表。在你的情況下,它是PersonCompany。在創建數據庫表時,EF永遠不會引用上下文類中的屬性。

在創建表時,它會嘗試變複數的名稱,以便Person得到了使用複數來PeopleCompany得到多元狀態,以Companies

就像一個快速測試,如果您將Company類的名稱更改爲Corporation,則表名將創建爲Corporations。我也是在上下文類改變相應的屬性名CorporationFooBar

這裏是我做過什麼來測試它:

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現在前進並創造Corporations表而不是(的Corporation複數)和忽略存在於上下文類中的FooBar屬性名稱。

在您的代碼中,僅僅是巧合,您已將您的上下文類中的屬性命名爲People,它恰好是Person的複數。這讓你感到困惑,並讓你思考。