本文源码下载地址:http://www.80cxy.com/Blog/ResourceView?arId=202403191532545995NAAqJh
系列教程地址:http://www.80cxy.com/Blog/ArticleView?arId=202403191517574161ay3s5V
本文在项目中使用Migration工具创建数据库,主要包括三个方面的内容,一是在SignUp.Domain项目中创建数据库实体类,二是在SignUp.Infrastructure创建数据库实体配置,也就是实体属性与数据库字段的对应关系配置,三是创建DbContext类,数据库连接存放系统环境变量里面。
项目创建了WebApplicationBuilderExtensions类用于写相关配置代码,如数据库连接配置、Swagger、Cors、Redis等配置。以及实体类的一些基类。
一、包引用
SignUp.Common 项目安装如下包:
Install-Package Swashbuckle.AspNetCore、
Install-Package System.Data.SqlClient
Install-Package AsmResolver.DotNet -Version 5.0.1
Install-Package Microsoft.EntityFrameworkCore -Version 7.0.3
Install-Package Microsoft.EntityFrameworkCore.SqlServer -Version 7.0.3
Install-Package MediatR
SignUp.Infrastructure项目安装如下包:
Install-Package Microsoft.EntityFrameworkCore -Version 7.0.3
Install-Package Microsoft.EntityFrameworkCore.SqlServer -Version 7.0.3
Install-Package Microsoft.EntityFrameworkCore.Tools -Version 7.0.3
SignUp.WebApi项目安装如下包:
Install-Package Microsoft.EntityFrameworkCore.Design -Version 7.0.3
二、创建相关实体类
public record SysUser : IAggregateRoot { public Guid Id { get; set; } /// <summary> /// 用户名 /// </summary> public string UserName { get; set; } /// <summary> /// 用户密码 /// </summary> private string Password; /// <summary> /// 真实姓名 /// </summary> public string? RealName { get; set; } /// <summary> /// 用户类型 /// </summary> public string? UserType { get; set; } /// <summary> /// 角色Id /// </summary> public Guid? RoleId { get; set; } /// <summary> /// 角色 /// </summary> public string? RoleName { get; set; } /// <summary> /// 是否禁用 /// </summary> public bool IsDisable { get; set; } } public record SysRole : IAggregateRoot { public Guid Id { get; set; } /// <summary> /// 角色名称 /// </summary> public string Name { get; set; } /// <summary> /// 备注 /// </summary> public string? Remark { get; set; } } public record SysRoleDetails { public Guid Id { get; set; } /// <summary> /// 角色Id /// </summary> public Guid RoleId { get; set; } /// <summary> /// 菜单Id /// </summary> public Guid MenuId { get; set; } } public record SysMenu :BaseEntity, IAggregateRoot { /// <summary> /// 菜单名称 /// </summary> public string Name { get; set; } /// <summary> /// 菜单分类 /// </summary> public string? Sort { get; set; } /// <summary> /// 父层Id /// </summary> public Guid? ParentId { get; set; } /// <summary> /// 路由权限值 /// </summary> public string? RouterName { get; set; } /// <summary> /// 菜单级别 /// </summary> public int Level { get; set; } /// <summary> /// 备注 /// </summary> public string? Remark { get; set; } public SysMenu[] Children { get; set; } } public record SysConfig : IAggregateRoot { public float Id { get; set; } /// <summary> /// 名称 /// </summary> public string Name { get; set; } /// <summary> /// 值 /// </summary> public string Value { get; set; } }
三、创建实体配置类
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; using SignUp.Domain.Entities; namespace SignUp.Infrastructure.Configs { public class SysMenuConfig : IEntityTypeConfiguration<SysMenu> { public void Configure(EntityTypeBuilder<SysMenu> builder) { builder.ToTable("SysMenu"); builder.HasKey(f => f.Id); builder.Property(f => f.Name).HasMaxLength(200).IsUnicode(true); builder.Property(f => f.Sort).HasMaxLength(20).IsUnicode(true); builder.Property(f => f.Remark).HasMaxLength(400).IsUnicode(true); builder.Ignore(f => f.Children); } } public class SysRoleConfig : IEntityTypeConfiguration<SysRole> { public void Configure(EntityTypeBuilder<SysRole> builder) { builder.ToTable("SysRole"); builder.HasKey(f => f.Id); builder.Property(f => f.Name).HasMaxLength(200).IsUnicode(true); builder.Property(f => f.Remark).HasMaxLength(400).IsUnicode(true); } } public class SysRoleDetailsConfig : IEntityTypeConfiguration<SysRoleDetails> { public void Configure(EntityTypeBuilder<SysRoleDetails> builder) { builder.ToTable("SysRoleDetails"); builder.HasKey(f => f.Id); } } public class SysMenuConfig : IEntityTypeConfiguration<SysMenu> { public void Configure(EntityTypeBuilder<SysMenu> builder) { builder.ToTable("SysMenu"); builder.HasKey(f => f.Id); builder.Property(f => f.Name).HasMaxLength(200).IsUnicode(true); builder.Property(f => f.Sort).HasMaxLength(20).IsUnicode(true); builder.Property(f => f.Remark).HasMaxLength(400).IsUnicode(true); builder.Ignore(f => f.Children); } } }
四、创建DbContext
using Microsoft.EntityFrameworkCore; using SignUp.Domain.Entities; using System.Reflection; namespace SignUp.Infrastructure { public class SignUpDbContext : DbContext { public DbSet<RecruitBase> RecruitBase { get; set; } public DbSet<RecruitPosition> RecruitPosition { get; set; } public DbSet<RecruitUser> RecruitUser { get; set; } public DbSet<TalentBase> TalentBase { get; set; } public DbSet<TalentBaseCheck> TalentBaseCheck { get; set; } public DbSet<TalentEnterviewTicket> TalentEnterviewTicket { get; set; } public DbSet<TalentWrittenTicket> TalentWrittenTicket { get; set; } public DbSet<SysLog> SysLog { get; set; } public DbSet<SysMenu> SysMenu { get; set; } public DbSet<SysUser> SysUser { get; set; } public DbSet<SysRole> SysRole { get; set; } public DbSet<SysRoleDetails> SysRoleDetails { get; set; } public DbSet<TalentFile> TalentFile { get; set; } public SignUpDbContext(DbContextOptions<SignUpDbContext> opt) : base(opt) { } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly()); } } }
五、创建DbContextFactory类供Migration工具操作数据库使用
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Design; using Microsoft.Extensions.Configuration; namespace SignUp.Infrastructure { //migration操作数据库使用 public class DbContextFactory : IDesignTimeDbContextFactory<SignUpDbContext> { public SignUpDbContext CreateDbContext(string[] args) { var builder = new DbContextOptionsBuilder<SignUpDbContext>(); //从appsettings.json获取数据库连接 //IConfigurationRoot configuration = new ConfigurationBuilder() // .SetBasePath(Directory.GetCurrentDirectory()) // .AddJsonFile("appsettings.json") // .Build(); //string connStr = configuration.GetValue<string>("DefaultDB:ConnStr"); //从环境变量里面获取数据库连接 IConfigurationRoot configuration = new ConfigurationBuilder().AddEnvironmentVariables().Build(); string connStr = configuration.GetValue<string>("DefaultDB:ConnStr"); builder.UseSqlServer(connStr); return new SignUpDbContext(builder.Options); } } }
六、执行Migration命令创建数据库
Add-Migration init
Update-database
附:WebApplicationBuilderExtensions源码
using Microsoft.AspNetCore.Builder; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using SignUp.Common.Commons; using SignUp.Common.EFCore; using SignUp.Common.EFCore.DBConfiguration; using System.Data.SqlClient; namespace SignUp.Common.Initializer { public static class WebApplicationBuilderExtensions { public static void ConfigureDbConfiguration(this WebApplicationBuilder builder) { //从数据库中读取相关配置信息,如Redis链接 builder.Host.ConfigureAppConfiguration((hostCtx, configBuilder) => { //不能使用ConfigureAppConfiguration中的configBuilder去读取配置,否则就循环调用了,因此这里直接自己去读取配置文件 //读取appsettings.json文件配置 //var configRoot = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build(); //string connStr = configRoot.GetValue<string>("DefaultDB:ConnStr"); //读取环境变量配置 //string connStr = builder.Configuration.GetValue<string>("DefaultDB:ConnStr"); //configBuilder.AddDbConfiguration(() => new SqlConnection(connStr), reloadOnChange: true, reloadInterval: TimeSpan.FromSeconds(5)); }); } public static void ConfigureExtraServices(this WebApplicationBuilder builder, InitializerOptions initOptions) { IServiceCollection services = builder.Services; IConfiguration configuration = builder.Configuration; var assemblies = ReflectionHelper.GetAllReferencedAssemblies(); //配置数据库链接 services.AddAllDbContexts(ctx => { //连接字符串如果放到appsettings.json中,会有泄密的风险 //如果放到UserSecrets中,每个项目都要配置,很麻烦 //因此这里推荐放到环境变量中。 string connStr = configuration.GetValue<string>("DefaultDB:ConnStr"); ctx.UseSqlServer(connStr); }, assemblies); } } }
项目解决方案截图如下:
- net core+webapi+nginx windows 服务器部署(1321)
- .Nuget Packages 太占C盘,删除后可以放到其他盘(1194)
- ASP.NET Core 配置 Swagger 显示接口注释描述信息(1094)
- vue调用接口后获取不到后端返回的Header响应头(964)
- .net core 系列实例开发教程-权限管理系统功能介绍(952)
- .net core 6.0 web API + SwaggerUI + IIS部署(912)
- .net core 实例教程(十二)配置启用Swagger中的【Authorize】按钮(831)
- .net core 实例教程(一)新建项目(797)
- .net core 实例教程(十四)配置 Swagger 显示接口注释描述信息及支持版本控制(783)
- .net 6中使用log4net写sqlserver数据库日志(756)
- 2025年3月 (1)
- 2024年6月 (2)
- 2024年5月 (2)
- 2024年4月 (4)
- 2024年3月 (30)
- 2024年1月 (4)
- 2023年12月 (2)
- 2023年11月 (4)
- 2023年10月 (4)
- 2023年9月 (6)
- 2023年3月 (2)
- 2023年2月 (1)
- 2023年1月 (1)
- 2022年12月 (1)
- 2022年9月 (21)
- 2022年8月 (10)
- 2022年7月 (3)
- 2022年4月 (1)
- 2022年3月 (13)
- 2021年8月 (1)
- 2021年3月 (1)
- 2020年12月 (42)
- 2020年11月 (7)
- 2020年10月 (5)
- 2020年8月 (1)
- 2020年6月 (1)
- 2020年3月 (2)
- 2019年12月 (8)
- 2019年11月 (3)
- 2019年9月 (1)
- 2019年4月 (1)
- 2019年3月 (6)
- 2019年2月 (1)
- 2018年7月 (7)
- 1.asp.net mvc内微信pc端、H5、JsApi支付方式总结(5702)
- 2.各大搜索网站网站收录提交入口地址(3201)
- 3.Windows 10休眠文件更改存储位置(3163)
- 4.ECharts仪表盘实例及参数使用详解(3095)
- 5.windows 10安装myeclipse 10破解补丁cracker.jar、run.bat闪退解决办法(2991)
- 6.HTML5 WebSocket与C#建立Socket连接实现代码(2866)
- 7.华为鸿蒙系统清除微信浏览器缓存方法(2779)
- 8.CERT_HAS_EXPIRED错误如何解决(2245)
- 9.Js异步async、await关键字详细介绍(lambda表达式中使用async和await关键字)(2188)
- 10.HBuilder编辑器格式化代码(2118)