【问题标题】:Using CustomPropertyTypeMap to map specific properties使用 CustomPropertyTypeMap 映射特定属性
【发布时间】:2014-12-24 16:02:09
【问题描述】:

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

我找不到关于可与 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 水合剩余的未修饰属性,还是我必须做一些自定义的事情?

谢谢。

【问题讨论】:

    标签: c# sql data-access-layer dapper dapper-extensions


    【解决方案1】:

    Dapper.FluentMap 允许您配置从 POCO 属性到列表的映射。它通过使用CustomPropertyTypeMap 并使用DefaultTypeMap 作为后备来做到这一点。

    它以NuGet package 的形式提供,但您也可以查看source 并了解我如何实现CustomerPropertyTypeMap 并为自己创建一个更简单的实现。

    【讨论】:

    • 谢谢,我去看看。目前我正在使用this solution,但我需要提前进行一些反思。我的查询采用通用方法,因此我不知道服务层中的哪些内容需要在没有反射的情况下进行映射。我会看看 Dapper.FluentMap 看看它是否能解决这个问题!
    • Dapper.FluentMap 实际上使用了那里提出的后备映射器解决方案,它只是一个更完整的映射类解决方案,没有反射麻烦。
    • 很好,感谢您的帮助。我会把它拉下来!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    相关资源
    最近更新 更多