前言:
今天下午一直在纠结这个问题,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));
}