using Bunny.Dao.Entity; using Bunny.Dao.Entity.System; using Bunny.Dao.Entity.System.Dept; using Bunny.Dao.Entity.System.Menu; using Bunny.Dao.Entity.System.User; using log4net; using Microsoft.EntityFrameworkCore; using Microsoft.IdentityModel.Tokens; namespace Bunny.Common.Context.Database; /// /// EfCore 连接内容 /// dotnet tool install --global dotnet-ef /// dotnet add package Microsoft.EntityFrameworkCore.Design /// dotnet ef migrations add InitialCreate /// dotnet ef database update /// public class EfCoreContext : DbContext { private static readonly ILog Log = LogManager.GetLogger(typeof(EfCoreContext)); public EfCoreContext() { var dataBaseConnection = AppSettings.GetAppConfig("DataBase:DataBaseConnection"); DbPath = $"Data Source={dataBaseConnection}"; } // 连接路径 private string DbPath { get; } public DbSet Icons { get; set; } public DbSet Dept { get; set; } public DbSet DeptUsers { get; set; } public DbSet Users { get; set; } public DbSet Roles { get; set; } public DbSet Permissions { get; set; } public DbSet UserRoles { get; set; } public DbSet UserPermissions { get; set; } public DbSet Menus { get; set; } public DbSet MenuRoles { get; set; } public DbSet MenuPermissions { get; set; } /// /// 配置数据库上下文选项,指定数据库连接字符串 /// protected override void OnConfiguring(DbContextOptionsBuilder options) { Log.Info("正在连接数据库。。。"); options.UseSqlServer(DbPath); Log.Info("连接数据库完成层。。。"); } /// /// 在创建模型时,为所有继承自BaseEntity的实体类型添加软删除查询过滤器 /// protected override void OnModelCreating(ModelBuilder modelBuilder) { // 为每个表指定 blogging 架构 modelBuilder.HasDefaultSchema("dbo"); // 根据基础类型创建数据库表 foreach (var entityType in modelBuilder.Model.GetEntityTypes()) if (typeof(BaseEntity).IsAssignableFrom(entityType.ClrType)) entityType.AddSoftDeleteQueryFilter(); base.OnModelCreating(modelBuilder); } /// /// 重写SaveChanges方法,在保存更改之前设置系统字段 /// public override int SaveChanges() { SetSystemField(); return base.SaveChanges(); } /// /// 重写SaveChanges方法,在保存更改之前设置系统字段 /// public override int SaveChanges(bool acceptAllChangesOnSuccess) { SetSystemField(); return base.SaveChanges(acceptAllChangesOnSuccess); } /// /// 异步保存更改,设置系统字段 /// public override Task SaveChangesAsync(CancellationToken cancellationToken = new()) { SetSystemField(); return base.SaveChangesAsync(cancellationToken); } /// /// 异步保存更改,设置系统字段 /// public override Task SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = new()) { SetSystemField(); return base.SaveChangesAsync(acceptAllChangesOnSuccess, cancellationToken); } /// /// 系统字段赋值 /// private void SetSystemField() { foreach (var item in ChangeTracker.Entries()) if (item.Entity is BaseEntity entity) { var userId = BaseContext.GetUserId(); switch (item.State) { // 添加操作 case EntityState.Added: { if (entity.Id.IsNullOrEmpty()) entity.Id = Guid.NewGuid().ToString(); entity.CreateTime = DateTime.Now; entity.UpdateTime = DateTime.Now; entity.Version = DateTime.Now; // 判断用户Id是否为空 if (userId != null && userId != 0) { entity.CreateUserId = userId.Value; entity.UpdateUserId = userId.Value; } break; } // 修改操作 case EntityState.Modified: entity.UpdateTime = DateTime.Now; if (userId != null) entity.UpdateUserId = userId.Value; break; } } } }