【问题标题】:Using Dapper to bind with a strongly typed model with additional dynamic properties使用 Dapper 绑定具有附加动态属性的强类型模型
【发布时间】:2013-02-11 12:19:51
【问题描述】:

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

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

Id
Title
c_MyCustomField1
c_MyCustomField2

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

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

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

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

我认为圣杯最终会是这样的模型:

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 来完成吗?

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

【问题讨论】:

    标签: c# dynamic dapper strong-typing


    【解决方案1】:

    目前无法在 dapper 中清晰地建模;您也许可以使用非通用 API 做一些事情,然后手动应用绑定。或者也许只是包装一个动态:

    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; }
        }
    }
    

    您可以在不指定泛型参数的情况下使用Query 获得dynamic / IDictionary&lt;string,object&gt;

    【讨论】:

    • 有趣的是,“干净”是一个形容词,在讨论这个问题时出现了很多。如果我们决定采取飞跃,您的建议绝对是我们前进的方向。感谢您的宝贵时间。
    • 在最新版本的 Dapper 中我们现在有更好的绑定方式吗?
    • @CoderAbsolute 目前没有,没有
    • 目前,我的整个应用程序都在 Dapper 上。很抱歉抓住这个线程,但我想将我的模型(强类型)转换为 dapper 和 SimpleCRUD 接受的匿名类型。你有更清洁的方法吗?
    • @CoderAbsolute dapper 如果您将模型传递给它会非常高兴 - 它会尝试挑选要发送的成员等
    猜你喜欢
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多