在Domain项目新建一个类,包含用户表要增加的头像,工号,类型字段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | public class AbpUserExt : FullAuditedAggregateRoot<Guid> { /// <summary> /// 头像 /// </summary> public string Avatar { get ; set ; } /// <summary> /// 个人介绍 /// </summary> public string Introduction { get ; set ; } /// <summary> /// 用户编号(例如工号) /// </summary> public string UserCode { get ; set ; } /// <summary> /// 用户类型,0=后台,1=前台,2=分销商。。。 /// </summary> public int UserType { get ; set ; } } |
在XXXDbContextModelCreatingExtensions 的方法里,映射到原来的AbpUsers表
builder.Entity<AbpUserExt>(b => { b.ToTable(AbpIdentityDbProperties.DbTablePrefix + "Users"); b.ConfigureByConvention(); b.Property(b => b.Avatar).IsRequired(false).HasMaxLength(255).HasComment("用户头像"); b.Property(b => b.Introduction).IsRequired(false).HasMaxLength(255).HasComment("用户简介"); b.Property(b => b.UserCode).IsRequired(false).HasMaxLength(50).HasComment("用户编号"); b.Property(b => b.UserType).IsRequired(true).HasDefaultValue(0).HasComment("用户类型"); b.HasOne<IdentityUser>().WithOne().HasForeignKey<AbpUserExt>(x => x.Id); });
运行DbMigrator 项目,会出错。
System.InvalidOperationException:“'AbpUserExt.DeletionTime' and 'IdentityUser.DeletionTime' are both mapped to column 'DeletionTime' in 'AbpUsers', but are configured to use differing provider types ('DateTime' and 'DateTime?').”
改成
public class AbpUserExt { public Guid Id { get; set; } /// <summary> /// 头像 /// </summary> public string Avatar { get; set; } /// <summary> /// 个人介绍 /// </summary> public string Introduction { get; set; } /// <summary> /// 用户编号(例如工号) /// </summary> public string UserCode { get; set; } /// <summary> /// 用户类型,0=后台,1=前台,2=分销商。。。 /// </summary> public int UserType { get; set; } }
运行后台Swagger,会发现"extraProperties": {} 里面的数据都是null,没有拿到值,需要在XXXEfCoreEntityExtensionMappings里面的加上映射
ObjectExtensionManager.Instance .MapEfCoreProperty<IdentityUser, string>( "Avatar", (entityBuilder, propertyBuilder) => { propertyBuilder.HasMaxLength(255); } ) .MapEfCoreProperty<IdentityUser, string>( "Introduction", (entityBuilder, propertyBuilder) => { propertyBuilder.HasMaxLength(255); } ) .MapEfCoreProperty<IdentityUser, string>( "UserCode", (entityBuilder, propertyBuilder) => { propertyBuilder.HasMaxLength(50); } ) .MapEfCoreProperty<IdentityUser, int>( "UserType" ) ;
前端 列表,在abpUser.ts 编辑tableColumns 变量
export const tableColumns: BasicColumn[] = [ { title: t('routes.admin.userManagement_userName'), dataIndex: 'userName', }, { title: t('routes.admin.userManagement_userCode'), dataIndex: 'extraProperties', customRender: ({ text }) => { return text && text.UserCode; }, },
在editFormSchema定义里增加
export const editFormSchema: FormSchema[] = [ { { field: 'userCode', component: 'Input', label: t('routes.admin.userManagement_userCode'), required: false, labelWidth: 85, colProps: { span: 12, }, componentProps: { autocomplete: 'off', }, }, { field: 'userType', component: 'Input', componentProps: { autocomplete: 'off', }, label: t('routes.admin.userManagement_userType'), required: false, //是否必须 labelWidth: 130, colProps: { span: 12, }, }
编辑界面 EditAbpUser.vue里
let currentUserInfo = new IdentityUserDto(); const [registerModal, { changeOkLoading, closeModal }] = useModalInner((data) => { currentUserInfo = data.record; setFieldsValue({ name: data.record.name, userName: data.record.userName, email: data.record.email, phoneNumber: data.record.phoneNumber, userCode: data.record.extraProperties.UserCode, userType: data.record.extraProperties.UserType, }); });
新增界面CreateAbpUser.vue
// 保存用户 const submit = async () => { try { let request = getFieldsValue() as IdentityUserCreateDto;
//后端的属性是首字母大写UserCode,UserType,不这样写会显示UserType 不能为空 request.extraProperties.UserCode=request.extraProperties.userCode request.extraProperties.UserType = request.extraProperties.userType console.log('UserType:'); console.log(request.extraProperties.UserType); request.roleNames = defaultRolesRef.value; await createUserAsync({ request, changeOkLoading, validate, closeModal, resetFields, }); defaultRolesRef.value.length = 0;
提交
const submit = async () => { try { let request = getFieldsValue(); if (request.password != request.confirmPassword) { message.error(t("routes.admin.editPasswordMessage")); } let updateUserInput = new UpdateUserInput(); let userInfo = new IdentityUserUpdateDto(); userInfo.userName = request.userName; userInfo.name = request.name; userInfo.surname = currentUserInfo.surname; userInfo.email = request.email; userInfo.phoneNumber = request.phoneNumber; userInfo.extraProperties={UserType:request.userType,UserCode:request.userCode};
参考文章:
初识ABP vNext(5):ABP扩展实体 - xhznl - 博客园 (cnblogs.com)
Customizing Application Modules Extending Entities | Documentation Center | ABP.IO
Advanced table mapping - EF Core | Microsoft Learn
https://docs.abp.io/zh-Hans/abp/latest/Module-Entity-Extensions
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示