EF8 code first 模式下去除自动生成表加s(复数形式)全网第一帖

前言:
今天下午一直在纠结这个问题,EF如果采用code first模式,进行迁移,他会表名自动给你加上s形成复数形式,搜了很久找到的觉方案有两种,其中实体类指定表名的方法是可行的,另外一种都是说 modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 对于EF6是可行的,怎么搜也没有找到EF8的解决方案。

解决问题的过程:
首先是没有Conventions.Remove 这个方法,再就是找不到PluralizingTableNameConvention这个类。开始还以为是没有System.Data.Entity 引入的问题, 发现按照网上说法要装的是EF6,顿时就觉得不是解决问题之道。搜了一大圈也找不到一点头绪。那么就只好求助于微软官方的文档了。

一、微软官方文档地址:
安装 Entity Framework Core – EF Core | Microsoft Learn

 

二、解决思路:
1. 按照EF6中的做法,迁移过程中,EF有些默认的约定,如果不需要使用到这些默认的约定,那么就移除掉这些默认的约定即可。应该EF8中也是这个思路。移除方法多半是Remove。搜索这个条件了。

 

2. 找到这个搜索结果,跟我的需求有些接近

 

3. 点击进去 ConventionSet.Remove 方法

定义

命名空间:

Microsoft.EntityFrameworkCore.Metadata.Conventions

程序集:

Microsoft.EntityFrameworkCore.dll

包:

Microsoft.EntityFrameworkCore v8.0.0

重载

展开表

Remove(Type)

删除给定类型的约定。

Remove<TConvention>(List<TConvention>, Type)

删除现有约定。

Remove(Type)

删除给定类型的约定。

C#复制

public virtual void Remove (Type conventionType);
参数

conventionType

Type

要删除的约定类型。

适用于

Entity Framework Core 8.0 和 Entity Framework Core 7.0

产品

版本

Entity Framework Core

7.0, 8.0

Remove<TConvention>(List<TConvention>, Type)

删除现有约定。

C#复制

public static bool Remove<TConvention> (System.Collections.Generic.List<TConvention> conventionsList, Type existingConventionType);
类型参数

TConvention

要删除的约定的类型。

参数

conventionsList

List<TConvention>

要扫描的现有约定实例的列表。

existingConventionType

Type

现有约定的类型。

返回

Boolean

true 如果删除了约定,则为 。

适用于

Entity Framework Core 8.0 和 Entity Framework Core 7.0、

3. 方法是找到了,那么就是怎么用这个方法了:

还是继续看官方文档,在这里找到了思路,创建并配置模型 – EF Core | Microsoft Learn

 

protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder)
{
configurationBuilder.Conventions.Remove(typeof(ForeignKeyIndexConvention));
}
4. 那么重点就是找到不使用复数的类了。 文档中这句话

F Core 包括许多默认启用的模型生成约定。 可以在实现 IConvention 接口的类列表中找到所有这些约定。 但是,该列表不包括第三方数据库提供程序和插件引入的约定。

5. 进入到 IConvention 接口的类列表中查找,里面的类很多,但是没有长得像是去除表复数的。唯一一个跟数据库表相关的 TableNameFromDbSetConvention ,也只能是死马当活马医,试试看了。结果当然是可以。代码如下,在你订一个appcontext的文件中加入就行了。

protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder)
{
configurationBuilder.Conventions.Remove(typeof(TableNameFromDbSetConvention));

}