6

假设我有一个类(例如简单化),并且我想确保始终填充 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(dapper可以验证)之类的属性装饰属性PersonId

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

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

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

4

1 回答 1

5

目前,不,这是不可能的。事实上,在很多情况下填充部分模型非常有用,所以我不想添加任何隐含的东西。在许多情况下,域模型是数据模型的扩展视图,因此我认为选项 2 行不通——而且我知道它会在我的代码中出现无数个问题;p 如果我们将自己限制在更明确的范围内选项...

到目前为止,我们故意避免了属性之类的东西;我们的想法是尽可能保持简洁和直接。我并不是病态地反对属性——只是:必须探究它们可能会有问题。但也许是时候了......我们也许也可以同时允许简单的列映射,即

[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

但是:它更手动。

我愿意提供意见,但我想确保我们做了,而不是急于火上浇油。

于 2013-02-13T09:25:34.950 回答