本文源码下载地址: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);
}
}
}
项目解决方案截图如下:


- .Nuget Packages 太占C盘,删除后可以放到其他盘(1667)
- net core+webapi+nginx windows 服务器部署(1513)
- ASP.NET Core 配置 Swagger 显示接口注释描述信息(1281)
- .net core 6.0 web API + SwaggerUI + IIS部署(1269)
- vue调用接口后获取不到后端返回的Header响应头(1226)
- .net core 系列实例开发教程-权限管理系统功能介绍(1142)
- .net core 实例教程(十二)配置启用Swagger中的【Authorize】按钮(1116)
- .net core 实例教程(十一)生成JWT格式的token密码配置及代码(1035)
- .net core 实例教程(十四)配置 Swagger 显示接口注释描述信息及支持版本控制(998)
- .net core 实例教程(三)仓储及领域服务功能实现(既实现用户表的增删改查接口)(970)
- 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支付方式总结(5919)
- 2.Windows 10休眠文件更改存储位置(4000)
- 3.各大搜索网站网站收录提交入口地址(3504)
- 4.windows 10安装myeclipse 10破解补丁cracker.jar、run.bat闪退解决办法(3482)
- 5.ECharts仪表盘实例及参数使用详解(3463)
- 6.华为鸿蒙系统清除微信浏览器缓存方法(3256)
- 7.HTML5 WebSocket与C#建立Socket连接实现代码(3221)
- 8.CERT_HAS_EXPIRED错误如何解决(3021)
- 9.Js异步async、await关键字详细介绍(lambda表达式中使用async和await关键字)(2662)
- 10.HBuilder编辑器格式化代码(2430)
