You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RepoDB:如何通过属性名查询列且避免未映射字段抛异常?

解决RepoDB中未映射字段触发异常的性能问题

我们使用RepoDB的FluentMapper将POCO类映射到结构不合理的数据库表,示例代码如下:

FluentMapper.Entity<Article>().Table("data.Articles").Column(e => e.Id, "[Item-No]");

当需要查询特定字段时,会通过PropertyMapper.Get根据属性名解析对应的数据库列名:

var dbFieldName = PropertyMapper.Get<Article>(x => x.Id);

但95%的字段无需手动映射,调用PropertyMapper.Get时这些未映射字段会触发异常,捕获异常会大幅降低RepoDB的性能,以下是可行的解决方案:

解决方案

1. 预加载所有字段映射,跳过未手动配置的字段

在应用启动阶段,一次性遍历POCO的所有属性,为未手动映射的字段创建默认映射(属性名=列名),避免运行时触发异常:

var properties = typeof(Article).GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (var prop in properties)
{
    try
    {
        // 尝试获取已有映射,无映射则自动创建默认映射
        _ = PropertyMapper.Get<Article>(prop);
    }
    catch (MappingNotFoundException)
    {
        // 手动添加默认映射
        FluentMapper.Entity<Article>().Column(prop.Name, prop.Name);
    }
}

后续调用PropertyMapper.Get时,所有字段都存在映射,不会触发异常,一次性处理完成避免反复捕获异常的性能损耗。

2. 自定义属性映射查询方法,替代原生PropertyMapper.Get

利用RepoDB的TryGet方法(不会抛出异常)实现自定义查询逻辑,无映射时直接返回属性名:

public static string GetDbColumnName<T>(Expression<Func<T, object>> propertyExpression)
{
    var property = PropertyMapper.GetProperty<T>(propertyExpression);
    if (PropertyMapper.TryGet<T>(property, out var mapping))
    {
        return mapping.ColumnName;
    }
    // 无映射时返回属性名作为默认列名
    return property.Name;
}

调用时替换原生方法:

var dbFieldName = GetDbColumnName<Article>(x => x.Id);

3. 确保自动映射功能开启

RepoDB默认支持POCO属性名与数据库列名的大小写不敏感自动匹配,若未手动映射的字段符合该规则,确认自动映射功能未被禁用:

// 确保自动映射开启(默认状态为开启)
ConfigurationManager.SetSetting(SettingKeys.AutoMapDatabaseProperties, true);

此方式适合数据库列名与POCO属性名差异较小的场景,无需额外代码处理。

内容的提问来源于stack exchange,提问作者IngoB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 13:22:38