9

我有一些 ORM 框架的经验,比如 Hibernate,甚至 Entity Framework 3.0。

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

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

[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]

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

我想知道为什么微软以这种方式实现 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 不行。

各位大侠,请给个理由好吗!

4

2 回答 2

12

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

如果你想从所有表中排除它,你可以使用这个问题中的代码。

为什么这样做,我不知道,但我必须说,就个人而言,我属于认为表名应该是复数形式的阵营:)

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

于 2012-12-20T09:57:16.483 回答
0

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

于 2012-12-20T09:53:43.887 回答