假设我有一个类(例如,简单化),我想确保始终填充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,现在代码将会很好地完成。
我想做的是以下其中一项:
使用诸如Required之类的属性装饰属性PersonId(该dapper可以验证)
告诉dapper弄清楚映射没有完全填满(即,当查询中的数据没有填写类中的所有属性时抛出异常。)
目前这可能吗?如果没有,有人能指出我如何在不影响性能的情况下做到这一点吗?
恕我直言,第二个选项是最好的,因为它不会破坏用户的现有代码,并且不需要对我们可能无法访问的类进行更多属性修饰。
答案 0 :(得分:5)
目前,这是不可能的。事实上,在很多情况下,填充部分模型非常有用,因此我不想添加任何隐式。在许多情况下,域模型是数据模型的扩展视图,所以我不认为选项2可以工作 - 而且我知道它会破坏我的代码中的大量位置; p If我们将自己局限于更明确的选择......
到目前为止,我们故意避免像属性这样的事情;我们的想法是保持尽可能精益和直接。我不是病态地反对属性 - 只是:它必须探测它们是有问题的。但也许是时候了......我们也许可以同时允许简单的列映射,即
[Map(Name = "Person Id", Required = true)]
int PersonId { get; set; }
Name
和Required
都是可选的。思考?但这在某些方面存在问题 - 特别是目前我们只探测列,我们可以看到,特别是在可扩展性API中。
另一种可能性是我们检查的界面,允许您在加载后手动验证数据;例如:
public class Person : IMapCallback {
void IMapCallback.BeforePopulate() {}
void IMapCallback.AfterPopulate() {
if(PersonId == 0)
throw new InvalidOperationException("PersonId not populated");
}
}
界面选项让我在很多方面更快乐:
但是:它更加手动。
我愿意接受输入,但我想确保我们能够正确,而不是匆匆赶去所有枪支。