ASP.NET Database First模式下更新模型且保留原有自定义方法的实现方案
解决方案
方案1:使用*分部类(partial class)*拆分自定义逻辑(最推荐)
EF Core 脚手架默认生成的DbContext和实体类都是分部类,将自定义逻辑从自动生成的Tasks3Context.cs文件中剥离即可:
- 新建独立类文件,可命名为
Tasks3Context.Custom.cs - 在该文件中声明同名分部类,所有自定义的连接字符串切换逻辑、业务方法都写在这个文件中:
public partial class Tasks3Context : DbContext { // 自定义方法写在该文件内,不会被脚手架命令覆盖 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { if (!optionsBuilder.IsConfigured) { string connString = GetConnectionStringFromToken(); optionsBuilder.UseSqlServer(connString); } } private string GetConnectionStringFromToken() { // 从token提取数据、处理后返回对应连接字符串的业务逻辑 } }
后续运行脚手架命令时,只会覆盖自动生成的上下文文件,你自行创建的自定义分部类不会被修改,所有自定义逻辑可以完整保留。
方案2:手动更新指定实体,不运行脚手架命令
如果只是小范围调整表结构(比如修改列名、新增/删除字段),可以直接手动修改对应内容,无需运行脚手架命令:
- 找到
Models\MainModel目录下的Patient.cs实体类,直接修改对应属性名,比如将CNIC5改为CNIC - 若使用Fluent API做映射,同步修改自动生成的
Tasks3Context.cs中OnModelCreating方法里Patient实体的列映射配置即可;也可以直接给属性加[Column("CNIC")]特性实现映射,不需要修改自动生成的上下文代码。
方案3:脚手架命令新增参数避免覆盖上下文配置
EF Core 5.0及以上版本支持-NoOnConfiguring参数,添加该参数后运行脚手架命令不会生成、覆盖OnConfiguring方法的内容,命令示例如下:
Scaffold-DbContext "Server=.;Database=Tasks3;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models\MainModel -t Patient -f -NoOnConfiguring
内容的提问来源于stack exchange,提问作者Saqlain Mushtaq
相关产品推荐
相关产品推荐

