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

我在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 Users { get; set; } } 

然后打电话:

 var list = db.Users.ToList(); 

生成的sql看起来像:

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

因此,将发生错误,因为我没有任何名为Users的表。 此外,我将单数forms的名称表格称为复数forms。 你可以在这个链接中看到原因

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

更新:

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

 protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove(); base.OnModelCreating(modelBuilder); } 

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

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

该约定在DbModelBuilder.Conventions默认定义的DbModelBuilder.Conventions约定中定义。

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

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

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

使用entity framework生成模型时,取消选中“Pluralize或singularize generated objects names”