【发布时间】:2013-10-16 14:24:37
【问题描述】:
我想使用 EF 5 模型验证来避免数据库中的重复值,所以我使用这样的模型类:
[Table("MeasureUnits")]
public class MeasureUnit : IValidatableObject
{
public int MeasureUnitId { get; set; }
public string Symbol { get; set; }
public string Name { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
using (MeasureUnitRepository rep = new MeasureUnitRepository())
{
MeasureUnit measureUnit = rep.FindDuplicateBySymbol(this);
if (measureUnit != null)
yield return new ValidationResult(
"There is another unit with this symbol, you can't duplicate it",
new[] { "Symbol" });
}
}
存储库类创建 DbContext,实现 IDisposable,具有查找重复项的逻辑,这一切都按预期工作。
但是,使用调试器时,我意识到每次插入或更新都会执行两次验证,因此存储库(和 DbContext)也会被实例化和处理两次。
除此之外,控制器中还有另一个 DbContext,但只是找不到在模型类中使用它的方法,除了在模型的构造函数中包含 DbContext,但我觉得这不是正确的解决方案。
是否有更好的“正确”方法来实现此验证?
提前致谢。
【问题讨论】:
-
根据您希望如何处理验证错误,在数据库中创建唯一索引可能会更容易并且性能会更好(但是如果出现重复,您将获得 UpdateException 而不是验证异常)
-
@Pawel 我会使用索引来加快 FindDuplicateBy... 但我只是更喜欢在更改发布之前抓住它。但是,既然您提到了它,我意识到我也必须处理它,因为在验证之后但实际提交之前可能会发生重复。 (为此+1)
标签: c# entity-framework validation asp.net-mvc-4