一、表實體建立
1、菜單表
[Comment("菜單表")] [Table("t_identity_menu")] public class Menu : AuditedAggregateRoot<Guid>, ISoftDelete, IMultiTenant { [MaxLength(200)] [Comment("菜單名")] public string Name { get; set; } [MaxLength(50)] [Comment("菜單編碼")] public int Code { get; set; } [MaxLength(36)] [Comment("父級菜單標識")] public Guid ParentId { get; set; } [Comment("層級")] public int Level { get; set; } [MaxLength(200)] [Comment("圖標路徑")] public string IconUrl { get; set; } [MaxLength(200)] [Comment("跳轉路徑")] public string RedirectUrl { get; set; } [Comment("菜單類型 0 APP 1 web")] public int MenuType { get; set; } [Comment("地址類型")] public int MenuInOut { get; set; } [Comment("排序")] public int Sort { get; set; } [Comment("是否啓用")] public bool IsActive { get; set; } [Comment("是否刪除")] public bool IsDeleted { get; set; } [Comment("租戶Id")] public Guid? TenantId { set; get; } [Comment("用戶歸屬系統Id")] [MaxLength(20)] public string SystemId { get; set; } [Comment("備註")] [MaxLength(500)] public string Remark { get; set; } }
2、角色權限中間表
[Comment("角色權限中間表")] [Table("t_identity_role_authority")] public class RoleAuthority : AuditedAggregateRoot<Guid>, ISoftDelete, IMultiTenant {/// <summary> /// 角色id /// </summary> [MaxLength(36)] [Comment("角色標識")] public Guid RoleId { get; set; } /// <summary> /// 權限id /// </summary> [MaxLength(36)] [Comment("權限標識")] public Guid AuthId { get; set; } [Comment("是否刪除")] public bool IsDeleted { get; set; } /// <summary> /// 租戶Id /// </summary> public Guid? TenantId { get; set; } /// <summary> /// 構造函數 /// </summary> /// <param name="id"></param> /// <param name="tenantId"></param> /// <param name="roleId"></param> /// <param name="authId"></param> public RoleAuthority(Guid id, Guid? tenantId, Guid roleId, Guid authId) { TenantId = tenantId; Id = id; RoleId = roleId; AuthId = authId; } }
3、角色擴展表
[Comment("角色擴展表")] [Table("t_identity_role_expand")] public class RoleExpand : AuditedAggregateRoot<Guid> { public RoleExpand(Guid Id, int RoleType, Guid RoleId, int RoleStatus) { this.Id = Id; this.RoleId = RoleId; this.RoleType = RoleType; this.RoleStatus = RoleStatus; } [MaxLength(36)] [Comment("角色標識")] public Guid RoleId { get; set; } [Comment("角色類型")] public int RoleType { get; set; } [MaxLength(36)] [Comment("用戶狀態:0啓用、1禁用")] public int RoleStatus { get; set; } [MaxLength(20)] [Comment("歸屬系統Id")] public string SystemId { get; set; } }
4、角色菜單中間表
[Comment("角色菜單中間表")] [Table("t_identity_role_menu")] public class RoleMenu : AuditedAggregateRoot<Guid>, ISoftDelete { [MaxLength(36)] [Comment("角色標識")] public Guid RoleId { get; set; } [MaxLength(36)] [Comment("菜單標識")] public Guid MenuId { get; set; } [Comment("是否刪除")] public bool IsDeleted { get; set; } }
5、用戶擴展表
[Comment("用戶擴展表")] [Table("t_identity_user_expand")] public class UserExpand : AuditedAggregateRoot<Guid> { public UserExpand(Guid Id, int UserType, Guid UserId, UserStatusEnum userStatus = UserStatusEnum.Enable, int isConfirm = 0) { this.Id = Id; this.UserId = UserId; this.UserType = UserType; this.UserStatus = userStatus; this.IsConfirm = isConfirm; } [MaxLength(36)] [Comment("用戶標識")] public Guid UserId { get; set; } [Comment("用戶類型")] public int UserType { get; set; } [Comment("用戶狀態")] public UserStatusEnum UserStatus { get; set; } [Comment("是否已確認結果,0未確認,1已確認")] public int IsConfirm { get; set; } [MaxLength(200)] [Comment("用戶圖像")] public string HeadFileUrl { get; set; } [MaxLength(20)] [Comment("歸屬系統Id")] public string SystemId { get; set; } [Comment("鎖定狀態")] public bool? IsLock { get; set; } [Comment("登錄失敗次數")] public int? LoginFailedCount { get; set; } [Comment("鎖定時間")] public DateTime? LockTime { get; set; } [Comment("鎖定人")] public Guid? LockUserId { get; set; } [Comment("解鎖時間")] public DateTime? UnLockTime { get; set; } [Comment("解鎖人")] public Guid? UnLockUserId { get; set; } }
二、配置實體到EFCORE
1、IdentityManagementDbContext中增加實體集
2、IdentityManagementDbContextModelCreatingExtensions中增加實體和表的映射
三、建立公共的數據遷移項目
1、新建一個web項目
項目中引用對應的程序集:Volo.Abp.EntityFrameworkCore.MySQL、Microsoft.EntityFrameworkCore,引入對應要遷移的項目:Bridge.IdentityManagement.EntityFrameworkCore
注意版本號要統一。
2、新增EFCoreDbContextFactory類和EFCoreMigrationDbContext類
EFCoreDbContextFactory類,在類中配置了數據庫類型,要用的配置文件
public class EFCoreDbContextFactory : IDesignTimeDbContextFactory<EFCoreMigrationDbContext> { public EFCoreMigrationDbContext CreateDbContext(string[] args) { var configuration = BuildConfiguration(); var builder = new DbContextOptionsBuilder<EFCoreMigrationDbContext>() .UseMySql(configuration.GetConnectionString("Default"), ServerVersion.AutoDetect(configuration.GetConnectionString("Default")), o => o.SchemaBehavior(MySqlSchemaBehavior.Ignore)); return new EFCoreMigrationDbContext(builder.Options); } private static IConfigurationRoot BuildConfiguration() { var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: false); return builder.Build(); } }
EFCoreMigrationDbContext類中加和了要遷移的實體,要實體和表的映射擴展方法
public class EFCoreMigrationDbContext : AbpDbContext<EFCoreMigrationDbContext> { public EFCoreMigrationDbContext( DbContextOptions<EFCoreMigrationDbContext> options ) : base(options) { } #region 用戶權限管理模塊 public DbSet<Menu> Menus { get; set; } public DbSet<RoleAuthority> RoleAuthoritys { get; set; } public DbSet<Authority> Authoritys { get; set; } public DbSet<RoleMenu> RoleMenus { get; set; } public DbSet<UserExpand> UserExpands { get; set; } #endregion protected override void OnModelCreating(ModelBuilder builder) { builder.ConfigureIdentityManagement(); base.OnModelCreating(builder); } }
3、修改配置文件,增加數據庫連接
"ConnectionStrings": { "Default": "Server=123.249.14.34;Port=3306; Database=bridge; User=root; Password=xxxx;" },
四、遷移數據表
1、生成遷移文件
CREATE TABLE IF NOT EXISTS `__EFMigrationsHistory` ( `MigrationId` varchar(150) CHARACTER SET utf8mb4 NOT NULL, `ProductVersion` varchar(32) CHARACTER SET utf8mb4 NOT NULL, CONSTRAINT `PK___EFMigrationsHistory` PRIMARY KEY (`MigrationId`) ) CHARACTER SET=utf8mb4; START TRANSACTION; ALTER DATABASE CHARACTER SET utf8mb4; CREATE TABLE `Authoritys` ( `Id` char(36) COLLATE ascii_general_ci NOT NULL, `PageCode` varchar(64) CHARACTER SET utf8mb4 NULL, `PageName` varchar(64) CHARACTER SET utf8mb4 NULL, `MenuId` char(36) COLLATE ascii_general_ci NULL, `Operate` varchar(64) CHARACTER SET utf8mb4 NULL, `OperateName` varchar(64) CHARACTER SET utf8mb4 NULL, `IsDeleted` tinyint(1) NOT NULL DEFAULT FALSE, `TenantId` char(36) COLLATE ascii_general_ci NULL, `ExtraProperties` longtext CHARACTER SET utf8mb4 NULL, `ConcurrencyStamp` varchar(40) CHARACTER SET utf8mb4 NULL, `CreationTime` datetime(6) NOT NULL, `CreatorId` char(36) COLLATE ascii_general_ci NULL, `LastModificationTime` datetime(6) NULL, `LastModifierId` char(36) COLLATE ascii_general_ci NULL, CONSTRAINT `PK_Authoritys` PRIMARY KEY (`Id`) ) CHARACTER SET=utf8mb4; CREATE TABLE `t_identity_menu` ( `Id` char(36) COLLATE ascii_general_ci NOT NULL, `Name` varchar(200) CHARACTER SET utf8mb4 NULL COMMENT '菜單名', `Code` int NOT NULL COMMENT '菜單編碼', `ParentId` char(36) COLLATE ascii_general_ci NOT NULL COMMENT '父級菜單標識', `Level` int NOT NULL COMMENT '層級', `IconUrl` varchar(200) CHARACTER SET utf8mb4 NULL COMMENT '圖標路徑', `RedirectUrl` varchar(200) CHARACTER SET utf8mb4 NULL COMMENT '跳轉路徑', `MenuType` int NOT NULL COMMENT '菜單類型 0 APP 1 web', `MenuInOut` int NOT NULL COMMENT '地址類型', `Sort` int NOT NULL COMMENT '排序', `IsActive` tinyint(1) NOT NULL COMMENT '是否啓用', `IsDeleted` tinyint(1) NOT NULL DEFAULT FALSE COMMENT '是否刪除', `TenantId` char(36) COLLATE ascii_general_ci NULL COMMENT '租戶Id', `SystemId` varchar(20) CHARACTER SET utf8mb4 NULL COMMENT '用戶歸屬系統Id', `Remark` varchar(500) CHARACTER SET utf8mb4 NULL COMMENT '備註', `ExtraProperties` longtext CHARACTER SET utf8mb4 NULL, `ConcurrencyStamp` varchar(40) CHARACTER SET utf8mb4 NULL, `CreationTime` datetime(6) NOT NULL, `CreatorId` char(36) COLLATE ascii_general_ci NULL, `LastModificationTime` datetime(6) NULL, `LastModifierId` char(36) COLLATE ascii_general_ci NULL, CONSTRAINT `PK_t_identity_menu` PRIMARY KEY (`Id`) ) CHARACTER SET=utf8mb4 COMMENT='菜單表'; CREATE TABLE `t_identity_role_authority` ( `Id` char(36) COLLATE ascii_general_ci NOT NULL, `RoleId` char(36) COLLATE ascii_general_ci NOT NULL COMMENT '角色標識', `AuthId` char(36) COLLATE ascii_general_ci NOT NULL COMMENT '權限標識', `IsDeleted` tinyint(1) NOT NULL DEFAULT FALSE COMMENT '是否刪除', `TenantId` char(36) COLLATE ascii_general_ci NULL, `ExtraProperties` longtext CHARACTER SET utf8mb4 NULL, `ConcurrencyStamp` varchar(40) CHARACTER SET utf8mb4 NULL, `CreationTime` datetime(6) NOT NULL, `CreatorId` char(36) COLLATE ascii_general_ci NULL, `LastModificationTime` datetime(6) NULL, `LastModifierId` char(36) COLLATE ascii_general_ci NULL, CONSTRAINT `PK_t_identity_role_authority` PRIMARY KEY (`Id`) ) CHARACTER SET=utf8mb4 COMMENT='角色權限中間表'; CREATE TABLE `t_identity_role_expand` ( `Id` char(36) COLLATE ascii_general_ci NOT NULL, `RoleId` char(36) COLLATE ascii_general_ci NOT NULL COMMENT '角色標識', `RoleType` int NOT NULL COMMENT '角色類型', `RoleStatus` int NOT NULL COMMENT '用戶狀態:0啓用、1禁用', `SystemId` varchar(20) CHARACTER SET utf8mb4 NULL COMMENT '歸屬系統Id', `ExtraProperties` longtext CHARACTER SET utf8mb4 NULL, `ConcurrencyStamp` varchar(40) CHARACTER SET utf8mb4 NULL, `CreationTime` datetime(6) NOT NULL, `CreatorId` char(36) COLLATE ascii_general_ci NULL, `LastModificationTime` datetime(6) NULL, `LastModifierId` char(36) COLLATE ascii_general_ci NULL, CONSTRAINT `PK_t_identity_role_expand` PRIMARY KEY (`Id`) ) CHARACTER SET=utf8mb4 COMMENT='角色擴展表'; CREATE TABLE `t_identity_role_menu` ( `Id` char(36) COLLATE ascii_general_ci NOT NULL, `RoleId` char(36) COLLATE ascii_general_ci NOT NULL COMMENT '角色標識', `MenuId` char(36) COLLATE ascii_general_ci NOT NULL COMMENT '菜單標識', `IsDeleted` tinyint(1) NOT NULL DEFAULT FALSE COMMENT '是否刪除', `ExtraProperties` longtext CHARACTER SET utf8mb4 NULL, `ConcurrencyStamp` varchar(40) CHARACTER SET utf8mb4 NULL, `CreationTime` datetime(6) NOT NULL, `CreatorId` char(36) COLLATE ascii_general_ci NULL, `LastModificationTime` datetime(6) NULL, `LastModifierId` char(36) COLLATE ascii_general_ci NULL, CONSTRAINT `PK_t_identity_role_menu` PRIMARY KEY (`Id`) ) CHARACTER SET=utf8mb4 COMMENT='角色菜單中間表'; CREATE TABLE `t_identity_user_expand` ( `Id` char(36) COLLATE ascii_general_ci NOT NULL, `UserId` char(36) COLLATE ascii_general_ci NOT NULL COMMENT '用戶標識', `UserType` int NOT NULL COMMENT '用戶類型', `UserStatus` int NOT NULL COMMENT '用戶狀態', `IsConfirm` int NOT NULL COMMENT '是否已確認結果,0未確認,1已確認', `HeadFileUrl` varchar(200) CHARACTER SET utf8mb4 NULL COMMENT '用戶圖像', `SystemId` varchar(20) CHARACTER SET utf8mb4 NULL COMMENT '歸屬系統Id', `IsLock` tinyint(1) NULL COMMENT '鎖定狀態', `LoginFailedCount` int NULL COMMENT '登錄失敗次數', `LockTime` datetime(6) NULL COMMENT '鎖定時間', `LockUserId` char(36) COLLATE ascii_general_ci NULL COMMENT '鎖定人', `UnLockTime` datetime(6) NULL COMMENT '解鎖時間', `UnLockUserId` char(36) COLLATE ascii_general_ci NULL COMMENT '解鎖人', `ExtraProperties` longtext CHARACTER SET utf8mb4 NULL, `ConcurrencyStamp` varchar(40) CHARACTER SET utf8mb4 NULL, `CreationTime` datetime(6) NOT NULL, `CreatorId` char(36) COLLATE ascii_general_ci NULL, `LastModificationTime` datetime(6) NULL, `LastModifierId` char(36) COLLATE ascii_general_ci NULL, CONSTRAINT `PK_t_identity_user_expand` PRIMARY KEY (`Id`) ) CHARACTER SET=utf8mb4 COMMENT='用戶擴展表'; INSERT INTO `__EFMigrationsHistory` (`MigrationId`, `ProductVersion`) VALUES ('20231023025116_bridge_identity_20231022', '7.0.1'); COMMIT;