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

Tu *_*ran 8 c# entity-framework

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

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

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

[Table("User")]
public class User {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

public CustomContext : DbContext {
    // ...
    public DbSet<User> Users { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后打电话:

var list = db.Users.ToList();
Run Code Online (Sandbox Code Playgroud)

生成的sql看起来像:

Select [Extent1].[Username] From [Users] as [Extent1]
Run Code Online (Sandbox Code Playgroud)

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

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

更新:

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

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

    base.OnModelCreating(modelBuilder);
}
Run Code Online (Sandbox Code Playgroud)

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

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

SWe*_*eko 9

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

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

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

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


小智 0

当您使用实体框架生成模型时,取消选中“复数或单数生成的对象名称”