使用CustomPropertyTypeMap映射特定属性

本文关键字:属性 映射 CustomPropertyTypeMap 使用 | 更新日期: 2023-09-27 18:28:08

我有几个类,它们需要有一个或两个属性(几十个属性中的一个)映射到具有不同列名的表上的列。当数据库中的列名只有两个不同时,我不想映射所有属性。

我找不到关于所有可与CustomPropertyTypeMap一起使用的各种映射选项的像样的文档,它们都只是显示了用CustomPropertyTypeMap映射整个对象(Dapper测试类也是如此)。当我使用以下内容时:

// Set up custom repository parameter mappings.
var map = new CustomPropertyTypeMap(typeof(T),
    (type, columnName) => type
        .GetProperties()
        .FirstOrDefault(
            prop => prop.GetCustomAttributes(false)
                .OfType<RepositoryParameterAttribute>()
                .Any(attr => attr.ParameterName == columnName)));
Dapper.SqlMapper.SetTypeMap(typeof(T), map);
// Query the database
items = await databaseConnection.QueryAsync<T>(
    storedProcedure,
    itemParameters,
    commandType: CommandType.StoredProcedure,
    transaction: transaction);

未使用RepositoryParameterAttribute修饰的属性返回null(或0)。我可以用它来映射特定的属性,并让Dapper水合剩余的未装饰属性吗?还是我必须做一些自定义的事情?

谢谢。

使用CustomPropertyTypeMap映射特定属性

Dapper.FluentMap允许您配置从POCO属性到列表的映射。它通过使用CustomPropertyTypeMap和使用DefaultTypeMap作为回退来实现这一点。

它作为NuGet包提供,但您也可以查看源代码,看看我是如何实现CustomerPropertyTypeMap的,并为自己创建一个更简单的实现。