.NET Core - 获取 Model 中的 DbContext

6

我需要在模型中获取ApplicationDbContext。

我正在创建一个ValidationAttribute。该验证将检查数据库上的某些记录,并在必要时生成错误。

public class MyModel
{
  public int? ID { get; set; }
  [MyValidationForName]
  public string Name { get; set; }
}


public class MyValidationForName : ValidationAttribute
{
  protected ValidationResult IsValid(object value, ValidationContext validationContext)
  {
    /* code here */
    return new ValidationResult("This field contains an error");
  }
}

上面的示例在保存记录时会生成错误(DataAnnotation)。仅检查日期,长度等是可以的。
但我必须查询数据库中的某些记录。为了执行此操作,不能将DB上下文传递到模型中。
我阅读过的所有SO主题都解释了如何使用Remote和JS进行验证,在Controller中放置验证。我不想这样做。
最相关的SO主题是:Using DB Context in a Custom Validation Attribute(通过添加上下文仍然无法工作)。
有人可以帮助我将ApplicationDbContext传递给模型以执行查询并使用ValidationAttribute进行验证吗?

为什么不将执行验证的代码从属性中分离出来?这样你就可以在需要的任何地方应用相同的验证 - 在属性或数据库记录中。 - stuartd
那个验证非常具体。我必须在创建记录之前验证字段。对我来说,将验证放在模型中是很正常的。你有你的解决方案的例子吗? - Eduardo
我理解您想要模型验证名称,但模型不必包含实际的验证代码,该代码可以位于另一个类中。这样可以从模型和其他地方调用它,例如将验证应用于现有的数据库数据或对验证代码进行单元测试。 - stuartd
1个回答

15

即使在 Stack Overflow 上,我也没有找到答案。但是经过多天的努力,我找到了解决方案。所以,我在下面提供答案,希望有帮助。

首先,在您的模型类中添加 using System.Linq;

然后,应用上下文:


var _context = (ApplicationDbContext)validationContext.GetService(typeof(ApplicationDbContext));

现在我们能够在ValidationAttribute中执行查询。
完整示例:
using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System.Linq;

public class MyModel
{

  public int? ID { get; set; }

  [Required(ErrorMessage = "Name can not be blank")]
  [ExampleValidation]
  public string Name { get; set; }

}

public class ExampleValidation : ValidationAttribute
{

  protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
      var _context = (ApplicationDbContext)validationContext
                         .GetService(typeof(ApplicationDbContext));

      /* my query here using the _context, and if necessary, apply the error message below: */
      return new ValidationResult("My error message here");

    }

  }
}

1
这对我非常有帮助!由于它是目前互联网上唯一好的答案,因此应该有数百个投票。 - Aday

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接