针对数据库的EF模型验证

Mig*_*oso 5 c# validation entity-framework asp.net-mvc-4

我想使用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" });
        }
    }
Run Code Online (Sandbox Code Playgroud)

存储库类创建DbContext,实现IDisposable,具有查找副本的逻辑,它都可以正常工作.

但是,使用调试器我意识到每次插入或更新都会执行两次验证,因此存储库(和DbContext)也会被实例化并处理两次.

除此之外,还有另一个DbContext存在于控制器中但只是在模型类中找不到使用它的方法,除了在模型的构造函数中包含DbContext,但我觉得它不是正确的解决方案.

是否有更好的"正确"方式来实现此验证?

提前致谢.

Col*_*lin 2

当您必须访问数据库时,您需要使用DbContext并且DbContext有一个名为 的 Overridable 方法ValidateEntity。请参阅这篇文章:实体框架验证

我把我在另一个答案中使用的代码放在这里

更多关于我如何在 MVC 中构造验证的信息请参见此处。

此外,在存储库中实例化上下文可能会让您感到悲伤。存储库需要共享上下文。您可以将上下文视为您的工作单元并将其传递到构造函数中的存储库中,或者您可以将上下文包装在您自己的工作单元中并将其传递进去。