目录

在Abp中根据ExtraProperties进行查询

Abp框架提供了实体扩展系统,允许在不对类的定义进行更改的情况下,向对象中添加额外的属性。默认地,额外属性是以json对象的形式存储在数据库表的ExtraProperties字段中,因此无法直接将额外属性作为查询条件。对于额外属性,Abp支持将其通过Entity Framework Core映射为数据库表的单独字段,因此我们可以利用数据库映射来实现根据额外属性进行查询。

数据库映射

将额外属性映射为数据库表字段非常容易。

通过Abp启动模板创建的解决方案中,预先生成了处理数据库映射的*EfCoreEntityExtensionMappings类,它位于*.EntityFrameworkCore项目中。在项目启动时,将会执行其中的Configure方法,通过OneTimeRunner执行一次操作。

OneTimeRunner.Run()方法的Action参数中,通过ObjectExtensionManager来处理额外属性到数据库表字段的映射。

ObjectExtensionManager.Instance
    .AddOrUpdateProperty<IdentityUser, string>(
        "Gender",
        options =>
        {
            options.MapEfCore((b, p) =>
            {
                b.HasIndex("Gender");
                p.IsRequired().HasDefaultValue(string.Empty);
                p.HasMaxLength(8);
            });
        }
    );

AddOrUpdateProperty方法中还可以设置表字段长度等,也可设置表的属性如索引。

添加数据迁移脚本并运行*.DbMigrator更新数据库接口,可以看到表中多出一个名为Gender的字段。

查询

在*.EntityFramework.Core项目中创建仓储,并创建查询方法。

public async Task<IdentityUser> GetUserByGenderAsync(string gender)
{
    return await (await GetDbSetAsync())
        .FromSqlRaw($"select * from AbpUsers where Gender == '{gender}'")
        .FirstOrDefaultAsync();
}

调用方法GetUserByGenderAsync并传入gender参数即可根据Gender进行查询。

总结

在这篇文章中,描述了如何对额外属性进行数据库映射,以及将额外属性作为查询条件检索数据。值得注意的是,将额外属性作为查询条件并不是最佳实践,如果可能的话应当尽量避免。此外,如需将拥有额外属性的Entity通过AutoMapper映射为Dto,不要忘记对Dto进行扩展并配置AutoMapperProfile

关注微信公众号“捕获异常”,获取最新文章推送,提升你的技能。