我在数据库表中有一个唯一的字段。当插入/更新数据时,我可以很容易地验证控制器中数据的唯一性:
if (db.Country.Where(x => x.ID != m.ID && x.Name == m.Name).Count() > 0)
{
// take action
}
但我认为最好通过使用IValidatableObject接口将此检查合并到模型中:
IEnumerable<ValidationResult> Validate(ValidationContext validationContext);
然而,在这里我没有访问数据库上下文的权限,我需要检查字段的唯一性...?
1条答案
按热度按时间qhhrdooz1#
理想情况下,您的模型不应该知道您的数据库,因为这往往会混淆关注点的分离,并使其更难测试。
另一个选项是创建一个可以检查唯一性的自定义属性:
正如你在评论中提到的,这个检查也可以在控制器中完成:
如果模型上的验证逻辑变得复杂,使用FluentValidation包可能是有意义的。我将其作为一个选项包括在内,因为它是一个流行的包,并且我倾向于用途:
无论选择哪种选项,都取决于您的用例,但是我不建议使用IValidatableObject的第一个选项,因为自定义ValidationAttribute以更干净的方式实现相同的结果。