c# - 使用 Dapper 绑定(bind)具有附加动态属性的强类型模型

标签 c# dynamic dapper strong-typing

我们希望能转移到使用 Dapper为我们的业务模型提供对象关系映射。

除了这些数据模型,我们还经常遇到自定义字段(在运行时未知),这些字段由用户创建并作为返回结果集的一部分出现:

Id
Title
c_MyCustomField1
c_MyCustomField2

目前,所有这些字段都由读取器返回和处理。我们喜欢将所有这些移至 Dapper但努力弄清楚如何将强类型对象与动态自定义字段混合在一起。

我们看到我们的选择是这样的:

  1. 将来自 dapper 的每个结果作为动态结果并进行我们自己的绑定(bind)。
  2. 让 Dapper 绑定(bind)到强类型模型并单独调用以附加自定义字段。
  3. 扩展 Dapper 以在中间添加我们的特定用户案例以绑定(bind)已知字段和动态字段。

1 似乎适得其反,我们可能会受到性能影响,这就是您首先引入 Dapper 的原因。 2 我们真的不能这样做,因为这需要对数据提供者进行大量更改。 3 我知道我不属于 Dapper 的来源。

我认为 chalice 会以这样的模型结束:

class Model
{
    int Id {get; set;}
    string Title {get; set;}
    IList<CustomField> CustomFields {get; set;}
}

class CustomField : dynamic
{
    string Name {get; set;}
    object Value {get; set;}
}

有什么方法可以使用 Dapper 完成吗?

一如既往,非常感谢任何建议。

最佳答案

目前无法在 dapper 中清晰地建模;您也许可以使用非通用 API 执行某些操作,然后手动应用绑定(bind)。或者可能只是包装一个动态:

class Model {
    private dynamic obj;
    public int Id { get { return obj.Id; } set { obj.Id = value; } }
    public string Title { get { return obj.Title; } set { obj.Title = value; } }

    public object this[string key] {
        get { return ((IDictionary<string,object>)obj)[key]; }
        set { ((IDictionary<string,object>)obj)[key] = value; }
    }
}

你可以得到一个dynamic/IDictionary<string,object>通过使用 Query不指定通用参数。

关于c# - 使用 Dapper 绑定(bind)具有附加动态属性的强类型模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14811736/

相关文章:

c# - webapp 的 `InSingletonScope` 究竟有多长?

c# - 并发网络请求性能问题

c# - 是否可以使用 .NET 动态对象即时创建属性?

c# - 如何使用 dapper 获得可为 null 的 int[]?

c# - 将 Data 的 switch 语句重构为不同类型的数据

php - 从表单访问动态变量

php - 在每个页面上包含菜单

c# - 如何使用 Dapper 在 IN 子句中使用超过 2100 个值?

c# - 如何使用 Dapper 在客户端获取原始 SQL 错误消息?

c# - BuildManager 解析页面继承