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

Abo*_*Dev 5 orm c#-4.0 dapper

假设我有一个类(例如,简化),我想确保总是填充PersonId和Name字段.

public class Person
{
    int PersonId { get; set; }
    string Name { get; set; }
    string Address { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

目前我的查询是

Person p = conn.Query<Person>("SELECT * FROM People");
Run Code Online (Sandbox Code Playgroud)

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

我想做的是以下之一:

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

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

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

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

Mar*_*ell 5

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

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

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

其中两个NameRequired是可选的.思考?但是,这在某些方面存在问题 - 特别是目前我们只调查我们可以看到的列,特别是在可扩展性API中.

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

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

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

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

但是:它更加手动.

我愿意接受投入,但我想确保我们做对了,而不是急于开枪.