为什么EF 5.x对表使用复数名称?

时间:2012-12-20 09:43:02

标签: c# entity-framework

我在ORM框架方面有过一些经验,比如Hibernate,甚至是Entity Framework 3.0。

默认情况下,这些框架对表使用单数名称。例如,类User将映射到表User。

但是当我使用Visual Studio 2012迁移到EF 5.x时,它使用复数名称并导致许多错误,除非我使用TableAttribute手动映射该类:

[Table("User")]
public class User {
    // ...
}

没有TableAttribute,如果我有DbContext,如下所示:

public CustomContext : DbContext {
    // ...
    public DbSet<User> Users { get; set; }
}

然后致电:

var list = db.Users.ToList();

生成的sql看起来像:

Select [Extent1].[Username] From [Users] as [Extent1]

因此,会出现错误,因为我没有任何名为用户的表。此外,我将单数形式的名称表格称为复数形式。您可以在this link

中查看原因

我想知道为什么Microsoft以这种方式实现EF 5.x而不是EF 3.0?

更新

我们可以通过在上下文类中使用此代码告诉EF不使用复数名称:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

    base.OnModelCreating(modelBuilder);
}

即使EF工具生成多个名称,它也应该保留原始数据库的映射,不应该吗?因为某些用户可能想要更改其类中的一些字段名称。 EF 3.0运行良好,但EF 5.x没有。

伙计们,请你给我一个理由!

2 个答案:

答案 0 :(得分:9)

该约定在DbModelBuilder.Conventions

中默认定义的PluralizingTableNameConvention约定中定义

如果要将其从所有表中排除,可以使用this question中的代码。

为什么这样做是按原样完成的,我不知道,但我必须说我个人在营地里认为表名应该是多元化的:)

在随SQL Server实例提供的示例数据库中,Northwind具有复数形式,而AdventureWorks使用单数形式,因此最多没有既定标准。我对每一个都进行了很多讨论,但是每个人都可以同意的一点是,一旦选择了命名策略,你就应该坚持下去。

答案 1 :(得分:0)

使用实体框架生成模型时,取消选中“Pluralize或singularize generated object names”