在 EF RC2 版本中没有这方面的约定。这是来自 EF Core 团队:
在过去的 EF Core 预发行版中,实体的表名是
与实体类名称相同。在 RC2 中,我们现在使用 DbSet 的名称
财产。如果没有为给定的实体类型定义 DbSet 属性,
然后使用实体类名。
现在,如果您想恢复为表的 RC1 命名约定,您有 3 种方法可以使用:
1.为 DbSet 属性选择单数名称:
一种方法是单数化您的 DbSet 属性名称(我不喜欢)。比如说你有一个 Book 实体并且你想映射到一个 Book 表:
public DbSet<Book> Book { get; set; }
2.使用 ToTable() Fluent API:
您当然可以始终使用 fluent API 来覆盖任何约定,并将表名指定为您想要的任何名称:
modelBuilder.Entity<Book>().ToTable("Book");
3.编写自定义约定:
仅仅因为 EF Core RC2 对此没有约定,并不意味着我们不能自己编写。为此,首先我们需要在ModelBuilder 对象上创建一个扩展方法:
using Microsoft.EntityFrameworkCore.Metadata.Internal;
public static class ModelBuilderExtensions
{
public static void RemovePluralizingTableNameConvention(this ModelBuilder modelBuilder)
{
foreach (IMutableEntityType entity in modelBuilder.Model.GetEntityTypes())
{
entity.Relational().TableName = entity.DisplayName();
}
}
}
然后我们只需从 DbContext 对象的 OnModelCreating 方法中调用它:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.RemovePluralizingTableNameConvention();
}
结束时:
我不喜欢复数表名,而且我比其他选项更喜欢最后一个选项,并同意了。也就是说,这是我个人的意见,其他开发人员可能会发现这 3 种方式中的任何一种都比其他方式更有利,并选择采用它:)