实体框架表名称约定

时间:2016-12-24 23:27:14

标签: c# entity-framework

我正在使用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 和 的 dbo.People

我的问题是为什么一个表名是人和其他表名是公司(我知道为什么是复数)。 我的意思是,一个表使用属性名称,另一个表使用类名?

提前致谢!

enter image description here

2 个答案:

答案 0 :(得分:4)

两者都使用类名来映射。
可能让你感到困惑的是Person类的映射。它是EF复数规则之一,因为人是复数形式的人(意味着不止一个人),EF将其映射为人。 另一方面,它只是将公司类映射为公​​司。

如果您不喜欢,可以在OnModelCreating()方法中添加此代码来关闭EF复数约定:

modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

答案 1 :(得分:1)

实体框架(EF)模型构建器始终在使用代码优先方法在数据库中创建表时引用您的类名。在您的情况下,它是PersonCompany。在创建数据库表时,EF从不引用上下文类中的属性。

在创建表格时,它会尝试复制名称,以便将Person复数化为People,将Company复数化为Companies

如果您将Company课程的名称更改为Corporation,则快速测试表格将会创建为Corporations。我还将上下文类中的相应属性名称Corporation更改为FooBar

以下是我测试它的方法:

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的复数,这仅仅是巧合。这让你困惑,让你思考。