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
相关产品推荐
相关产品推荐

