如何让Scaffold-DbContext生成继承IdentityDbContext的.NET Core上下文?
解决Scaffold-DbContext生成上下文继承IdentityDbContext的问题
不用每次手动修改,有两种实用方案:
方案一:自定义T4模板(一劳永逸,生成时直接得到目标继承关系)
- 先导出默认的Scaffold模板到项目的Templates文件夹,执行命令:
Scaffold-DbContext -OutputDir Models -ContextDir Data -Context OrderSystemVContext "你的数据库连接字符串" Microsoft.EntityFrameworkCore.SqlServer -Force -TemplateDir Templates
- 找到Templates文件夹下的
DbContext.tt文件,打开后修改两处:- 在模板顶部添加必要的using引用:
<#@ import namespace="Microsoft.AspNetCore.Identity.EntityFrameworkCore" #> <#@ import namespace="你的项目命名空间.Models" #> <!-- 替换成AppUser、AppRole所在的命名空间 --> - 找到生成上下文类的代码行(类似
<#= Accessibility.ForType(contextClass) #> partial class <#= contextClass.Name #> : DbContext),把: DbContext改成: IdentityDbContext<AppUser, AppRole, int>
- 在模板顶部添加必要的using引用:
- 之后每次执行Scaffold-DbContext命令时,加上
-TemplateDir Templates参数,生成的上下文就会直接继承IdentityDbContext<AppUser, AppRole, int>。
方案二:拆分Partial类(无需修改模板,更轻量化)
- 第一次执行Scaffold-DbContext生成默认的
OrderSystemVContext : DbContext后,保留自动生成的partial类文件(比如OrderSystemVContext.cs)。 - 新建一个同名的partial类文件,比如
OrderSystemVContext.Identity.cs,写入以下代码:
using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; using 你的项目命名空间.Models; // 替换成AppUser、AppRole的命名空间 namespace 你的项目命名空间.Data; // 替换成上下文所在的命名空间 public partial class OrderSystemVContext : IdentityDbContext<AppUser, AppRole, int> { public OrderSystemVContext(DbContextOptions<OrderSystemVContext> options) : base(options) { } }
- 删除自动生成的
OrderSystemVContext.cs里的: DbContext继承声明(partial类只要有一个定义了继承关系即可)。 - 以后每次执行Scaffold-DbContext时用
-Force参数覆盖自动生成的OrderSystemVContext.cs,只会更新实体和DbSet部分,不会影响你自己写的继承IdentityDbContext的partial类,自然不用手动修改继承关系。
注意事项
- 确保项目已安装
Microsoft.AspNetCore.Identity.EntityFrameworkCoreNuGet包。 - AppUser需继承
IdentityUser<int>,AppRole需继承IdentityRole<int>,确保泛型参数匹配。
内容的提问来源于stack exchange,提问作者Berat
相关产品推荐
相关产品推荐

