我在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没有。
伙计们,请你给我一个理由!
答案 0 :(得分:9)
该约定在DbModelBuilder.Conventions
PluralizingTableNameConvention
约定中定义
如果要将其从所有表中排除,可以使用this question中的代码。
为什么这样做是按原样完成的,我不知道,但我必须说我个人在营地里认为表名应该是多元化的:)
在随SQL Server实例提供的示例数据库中,Northwind具有复数形式,而AdventureWorks使用单数形式,因此最多没有既定标准。我对每一个都进行了很多讨论,但是每个人都可以同意的一点是,一旦选择了命名策略,你就应该坚持下去。
答案 1 :(得分:0)
使用实体框架生成模型时,取消选中“Pluralize或singularize generated object names”