Dapper不会因缺少数据而发出警告或失败

时间:2013-02-12 23:35:45

标签: c#-4.0 orm dapper

假设我有一个类(例如,简单化),我想确保始终填充PersonId和Name字段。

public class Person
{
    int PersonId { get; set; }
    string Name { get; set; }
    string Address { get; set; }
}

目前我的查询是

Person p = conn.Query<Person>("SELECT * FROM People");

但是,我可能已将我的数据库架构从PersonId更改为PID,现在代码将会很好地完成。

我想做的是以下其中一项:

  1. 使用诸如Required之类的属性装饰属性PersonId(该dapper可以验证)

  2. 告诉dapper弄清楚映射没有完全填满(即,当查询中的数据没有填写类中的所有属性时抛出异常。)

  3. 目前这可能吗?如果没有,有人能指出我如何在不影响性能的情况下做到这一点吗?

    恕我直言,第二个选项是最好的,因为它不会破坏用户的现有代码,并且不需要对我们可能无法访问的类进行更多属性修饰。

1 个答案:

答案 0 :(得分:5)

目前,这是不可能的。事实上,在很多情况下,填充部分模型非常有用,因此我不想添加任何隐式。在许多情况下,域模型是数据模型的扩展视图,所以我不认为选项2可以工作 - 而且我知道它会破坏我的代码中的大量位置; p If我们将自己局限于更明确的选择......

到目前为止,我们故意避免像属性这样的事情;我们的想法是保持尽可能精益和直接。我不是病态地反对属性 - 只是:它必须探测它们是有问题的。但也许是时候了......我们也许可以同时允许简单的列映射,即

[Map(Name = "Person Id", Required = true)]
int PersonId { get; set; }

NameRequired都是可选的。思考?但这在某些方面存在问题 - 特别是目前我们只探测列,我们可以看到,特别是在可扩展性API中。

另一种可能性是我们检查的界面,允许您在加载后手动验证数据;例如:

public class Person : IMapCallback {
    void IMapCallback.BeforePopulate() {}
    void IMapCallback.AfterPopulate() {
        if(PersonId == 0)
            throw new InvalidOperationException("PersonId not populated");
    }
}

界面选项让我在很多方面更快乐:

  • 它避免了大量额外的反射探测(只做一次检查)
  • 它更灵活 - 您可以选择对您来说重要的内容
  • 它不会影响可扩展性API

但是:它更加手动。

我愿意接受输入,但我想确保我们能够正确,而不是匆匆赶去所有枪支。