如何将自定义属性添加到用户实体


介绍

在本分步指南中,我将解释如何自定义用户实体类,该类可根据您的需要在使用ABP框架创建的每个Web应用程序中使用。阅读本文时,您将学习如何覆盖内置模块的服务,扩展实体,扩展数据传输对象以及在使用ABP框架开发的应用程序中自定义用户界面。

您可以在文章结尾看到下面的屏幕截图。

自定义身份用户列表

新的用户

准备项目

启动模板和初始运行

Abp Framework提供了启动模板,可以更快地投入工作。我们可以使用Abp CLI创建一个新的启动模板:

abp new CustomizeUserDemo

在本文中,我将介绍MVC应用程序,但它也将在Angular应用程序中工作。

下载完成后,我们可以运行CustomizeUserDemo.DbMigrator项目来创建数据库迁移并植入初始数据(管理员用户,角色等)。然后,我们可以运行CustomizeUserDemo.Web以查看我们的应用程序正在运行。

默认管理员用户名为admin,密码为1q2w3E *

初始项目

在本文中,我们将一起研究一个方案,并通过该方案找到问题的解决方案。但是,由于该场景不是现实生活中的场景,因此可能很奇怪,请不要对这个问题太了解😃

步骤1

将两个新属性添加到CustomizeUserDemo.Domain项目AppUser的Users文件夹中,如下所示:

public string Title { get; protected set; }

public int Reputation { get; protected set; }

第2步

CustomizeUserDemo.Domain.Shared项目中创建“用户”文件夹,在文件夹中创建类UserConsts,然后更新您创建的类,如下所示:

public static class UserConsts
{
    public const string TitlePropertyName = "Title";

    public const string ReputationPropertyName = "Reputation";

    public const int MaxTitleLength = 64;

    public const double MaxReputationValue = 1_000;

    public const double MinReputationValue = 1;
}

第三步

更新EntityFrameworkCore文件夹中CustomizeUserDemo.EntityFramework项目中CustomizeUserDemoEfCoreEntityExtensionMappings类,如下所示:

public static class CustomizeUserDemoEfCoreEntityExtensionMappings
{
    private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner();

    public static void Configure()
    {
        CustomizeUserDemoGlobalFeatureConfigurator.Configure();
        CustomizeUserDemoModuleExtensionConfigurator.Configure();

        OneTimeRunner.Run(() =>
        {
            ObjectExtensionManager.Instance
                .MapEfCoreProperty<IdentityUser, string>(
                    nameof(AppUser.Title),
                    (entityBuilder, propertyBuilder) =>
                    {
                        propertyBuilder.IsRequired();
                        propertyBuilder.HasMaxLength(UserConsts.MaxTitleLength);
                    }
                ).MapEfCoreProperty<IdentityUser, int>(
                    nameof(AppUser.Reputation),
                    (entityBuilder, propertyBuilder) =>
                    {
                        propertyBuilder.HasDefaultValue(UserConsts.MinReputationValue);
                    }
                );
        });
    }
}

此类可用于将这些额外的属性映射到数据库中的表字段。请阅读文章,以提高你的,我们正在做的事情的理解。

到目前为止,我们已经将额外的功能添加到了User实体中,并将​​这些功能与进行了匹配ef core

现在,我们需要添加迁移,以查看数据库中发生了什么变化。为此,请在菜单工具> NuGet软件包管理器下打开软件包管理器控制台(PMC)。

nuget-package-manager

选择CustomizeUserDemo.EntityFramework.DbMigrations作为默认项目,并执行以下命令:

Add-Migration "Updated-User-Entity"

新增迁移

这将MigrationsCustomizeUserDemo.EntityFrameworkCore.DbMigrations项目文件夹内创建一个新的迁移类

如果您使用的是Visual Studio以外的其他IDE,则可以使用此处记录的dotnet-ef工具

最后,运行CustomizeUserDemo.DbMigrator项目以更新数据库。

当我们更新数据库时,您可以看到TitleReputation列已添加到Users表中。

用户表

第四步

CustomizeUserDemoModuleExtensionConfiguratorCustomizeUserDemo.Domain.Shared项目中打开,然后更改ConfigureExtraProperties方法的内容,如下所示:

private static void ConfigureExtraProperties()
{
    ObjectExtensionManager.Instance.Modules().ConfigureIdentity(identity =>
    {
        identity.ConfigureUser(user =>
        {
            user.AddOrUpdateProperty<string>(
                UserConsts.TitlePropertyName,
                options =>
                {
                    options.Attributes.Add(new RequiredAttribute());
                    options.Attributes.Add(
                        new StringLengthAttribute(UserConsts.MaxTitleLength)
                    );
                }
            );
            user.AddOrUpdateProperty<int>(
                UserConsts.ReputationPropertyName,
                options =>
                {
                    options.DefaultValue = UserConsts.MinReputationValue;
                    options.Attributes.Add(
                        new RangeAttribute(UserConsts.MinReputationValue, UserConsts.MaxReputationValue)
                    );
                }
            );
        });
    });
}

而已。现在,让我们运行该应用程序,然后查看“身份”用户页面。如果需要,您也可以尝试编辑并重新创建记录,即使我们没有做任何额外的事情,它也将起作用。这是ABP框架背后的魔术代码。

如果需要添加情况,可以单击“贡献”按钮或发表评论。另外,如果您喜欢这篇文章,请不要忘记分享它😃

快乐编码😃

 

关注公众号:UP技术控   获取更多资讯


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM