EF Core 更改数据库的表名ToTable

本文介绍了如何在ASP.NET Core DbContext的OnModelCreating方法中,通过Entity<T>()方法更改实体TestGoods的数据库表名,从SMGoods更改为TestGoodsTest,以适应迁移和数据库更新操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为每一个实体设置一个表名

    [Table("SMGoods")]
    public class TestGoods : FullAuditedEntity<Guid>
    {
        /// <summary>
        /// 货品名称
        /// </summary>
        public string GoodsName { get; set; }
        /// <summary>
        /// 货品类型
        /// </summary>
        public string GoodsType { get; set; }
        /// <summary>
        /// 存放位置
        /// </summary>
        public string Location { get; set; }
        /// <summary>
        /// 货品数量
        /// </summary>
        public int GoodsNum { get; set; }
    }

目前的表名是SMGoods,执行完 Add-Migration 和Update-Database后,发现表名不对,想更改表名为TestGoodsTest,实现方法如下:
在XXXXDbContext里面的OnModelCreating中加入代码

	protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
           base.OnModelCreating(modelBuilder);
           //将数据库表名改为TestGoodsTest
           modelBuilder.Entity<TestGoods>().ToTable("TestGoodsTest");
    }
<think>我们正在解决用户的问题:在使用EF Core进行反向工程时,保持实体类数据库一致,并且不修改字段称。 根据之前的回答,我们知道: - 默认情况下,EF Core反向工程会对进行单数化处理(如"Products"会生成实体类"Product") - 为了保持实体类一致,我们可以使用`--no-pluralize`参数来禁用单数化 - 同时,用户要求不修改字段称(即列),而默认情况下,EF Core反向工程生成的属性与列是一致的(除非列不符合C#属性命规范,如以数字开头或包含空格等,此时EF Core会进行调整) 因此,我们只需要在反向工程命令中添加`--no-pluralize`参数即可同时满足: - 实体类一致(禁用单数化) - 属性与列一致(默认行为) 具体步骤: 1. 使用命令行工具(如PowerShell、CMD或终端)执行以下命令: ```bash dotnet ef dbcontext scaffold "Your_Connection_String" Microsoft.EntityFrameworkCore.SqlServer --no-pluralize --output-dir Models --context YourDbContext ``` 参数说明: - `"Your_Connection_String"`:替换为你的数据库连接字符串 - `Microsoft.EntityFrameworkCore.SqlServer`:指定数据库提供程序(根据实际情况选择,如SQLite、PostgreSQL等) - `--no-pluralize`:禁用单数化,确保实体类相同 - `--output-dir Models`:将生成的实体类文件放在项目的Models目录中(可自定义) - `--context YourDbContext`:指定生成的DbContext类的称(可自定义) 2. 执行命令后,生成的实体类将使用数据库作为类,并且属性数据库一致。 注意: - 如果数据库是保留关键字或包含特殊字符,EF Core可能会在属性上使用`[Column]`特性来指定原始列,这样仍然能保证映射正确。 - 如果列不符合C#属性命规范(例如以数字开头),EF Core会自动调整属性(例如在开头加下划线或添加字母等),但会使用`[Column]`特性来确保映射到正确的列。因此,在代码中使用的属性可能与列不完全相同,但映射关系是正确的。 如果用户希望属性也完全与列一致(包括在列不符合C#规范时也强制使用原始列作为属性),EF Core默认不提供这样的选项。因为这样可能会导致生成的代码无法通过编译(例如列为"123"时,属性不能是数字开头)。因此,默认行为是安全的。 如果用户确实需要属性与列完全一致(即使列不符合规范),那么可能需要手动修改生成的实体类,或者编写自定义的命转换规则(通过实现`IModelEntityTypeGenerator`和`IModelEntityTypeGenerator`等接口),但这比较复杂,通常不建议。 因此,我们推荐使用上述命令,它能够满足大多数情况下的需求。 生成的相关问题: 1. 如何配置EF Core反向工程生成的实体类使用单数命? 2. 反向工程时如何忽略某些? 3. 如何更新已经存在的DbContext和实体类以反映数据库更改? 4. 反向工程生成的实体类中,如何将某些列映射为枚举类型? 5. 如何自定义反向工程生成的实体类的命规则(例如添加前缀或后缀)?</think>### EF Core 反向工程:保持实体类一致且不修改字段称 在使用 EF Core 进行反向工程时,若需保持实体类数据库完全一致,**且不修改字段称**,可通过以下步骤实现: #### 解决方案(命令行工具) ```bash dotnet ef dbcontext scaffold "Server=.;Database=YourDB;User=sa;Password=123;" Microsoft.EntityFrameworkCore.SqlServer \ --no-pluralize \ # 禁用实体类单数化 --use-database-names \ # 保持字段与列完全一致 --output-dir Models \ # 输出目录 --context YourDbContext ``` **关键参数说明**: 1. `--no-pluralize` **作用**:禁用 EF Core 的自动单数化命规则 **效果**: `Products` → 实体类 `Products`(而非默认的 `Product`) 2. `--use-database-names` **作用**:强制属性数据库完全一致 **效果**:列 `created_date` → 属性 `created_date`(而非默认的 `CreatedDate`) --- #### 验证生成结果 生成的实体类将严格匹配数据库结构: ```csharp // 实体类 = public partial class Products { // 属性 = 列 public int product_id { get; set; } public string product_name { get; set; } public DateTime created_date { get; set; } } ``` --- #### 注意事项 1. **命规范冲突**: - 若列包含特殊字符(如空格),EF Core 会自动转换为下划线命(例:`Order Date` → `Order_Date`) - C# 保留字(如 `event`)会添加 `@` 前缀(生成 `@event`) 2. **数据类型映射**: - 数据库 `bit` 类型默认映射为 `bool` - `varchar(max)` 映射为 `string` - 可通过 `--type-mappings` 参数自定义映射规则[^1] 3. **性能优化**: ```bash --no-build \ # 跳过项目构建(加速生成) --force \ # 覆盖现有文件 --data-annotations \ # 使用数据注解替代 Fluent API ``` --- ### 图形化工具操作(EF Core Power Tools) 1. 右击项目 → **EF Core Power Tools** → **Reverse Engineer** 2. 设置: - ☑️ 取消勾选 **Use pluralization** - ☑️ 勾选 **Use database names** - ☑️ 勾选 **Preserve data annotation names**(保持原始称) 3. 点击 **OK** 生成代码[^2] --- ### 手动调整(备用方案) 若已生成代码,可通过以下方式修正: ```csharp // 数据注解方式 [Table("Products")] public class Products { [Column("product_id")] // 强制匹配列 public int product_id { get; set; } } // Fluent API 方式(在 DbContext 中) protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Products>(entity => { entity.ToTable("Products"); entity.Property(e => e.product_id).HasColumnName("product_id"); }); } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值