.NET Core-在模型中获取DbContext

时间:2018-10-31 17:43:48

标签: c# asp.net-mvc .net-core data-annotations

我需要在模型中获取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)。只能检查日期,长度等。

但是我必须查询数据库中的一些记录。为此,不能将数据库上下文传递给模型。

我读过的所有SO主题都说明了如何使用Remote和JS进行验证,并将验证放在Controller上。我不要这个。

最相关的SO主题是:Using DB Context in a Custom Validation Attribute(通过添加上下文,它仍然不起作用)

有人可以帮助我将ApplicationDbContext传递给模型以执行查询并使用ValidationAttribute对其进行验证吗?

1 个答案:

答案 0 :(得分:1)

即使在堆栈溢出时,我也从未找到答案。但是几天后,我得到了解决方案。所以,我在下面回答,希望对您有所帮助。

首先,在模型类中添加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");

    }

  }
}