如何避免ASP.NET Core 2 EF Database First模式下重Scaffold时覆盖上下文?
解决ASP.NET Core 2 + EF Database First模式下重新生成上下文被覆盖的问题
嘿,我太懂你这个烦恼了——用Database First模式开发时,第一次跑Scaffold-DbContext生成的类和上下文都很完美,但数据库改完再重新执行命令,之前手动加的modelBuilder配置或者自定义代码全被覆盖,真的挺糟心的。下面给你几个实用的解决办法,帮你彻底避开这个坑:
1. 分离上下文与模型文件,只覆盖模型
你可以用EF脚手架的参数把上下文和模型放到不同目录,这样每次更新时只强制覆盖模型,上下文文件完全保留。
执行命令时加上这些参数:
Scaffold-DbContext "你的数据库连接字符串" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -ContextDir Data -Context MyDbContext -Force
-OutputDir Models:把自动生成的实体模型类放到Models目录下-ContextDir Data:把DbContext文件放到Data目录下-Force:强制覆盖Models目录里的模型类,但不会碰Data目录的上下文
这样你就可以放心在Data目录的上下文里加自定义配置,再也不用担心被覆盖了。
2. 用部分类(Partial Class)扩展上下文
这是我个人最推荐的方案——把自动生成的上下文做成部分类,然后自己新建一个同名的部分类来存放自定义代码。
自动生成的上下文文件会是这样的(不用改它):
public partial class MyDbContext : DbContext { // EF自动生成的构造函数、DbSet定义等代码 protected override void OnModelCreating(ModelBuilder modelBuilder) { // 自动生成的modelBuilder配置 } }
你新建一个单独的文件(比如MyDbContext.Custom.cs),写自己的部分类:
public partial class MyDbContext : DbContext { protected override void OnModelCreating(ModelBuilder modelBuilder) { // 先调用自动生成的配置 base.OnModelCreating(modelBuilder); // 这里加你的自定义配置,比如索引、关系调整、数据种子等 modelBuilder.Entity<User>().HasIndex(u => u.Email).IsUnique(); modelBuilder.Entity<Order>().Property(o => o.CreateTime).HasDefaultValueSql("GETDATE()"); } }
每次重新执行Scaffold-DbContext时,只会覆盖EF自动生成的那个部分类文件,你自己写的自定义代码完全不受影响,完美实现“自动生成+自定义配置”的分离。
3. 小变更手动修改(适合微调场景)
如果你的数据库只是做了很小的改动——比如给某个表加了一个字段,或者改了字段类型,完全可以手动修改对应的模型类和上下文,不用重新生成整个脚手架。这样既快捷又不会破坏已有的自定义配置。
内容的提问来源于stack exchange,提问作者johnny
相关产品推荐
相关产品推荐

