.NET Core - Получить DbContext внутри модели - PullRequest
0 голосов
/ 31 октября 2018

Мне нужно получить ApplicationDbContext внутри модели.

Я создаю атрибут Validation. Эта проверка проверит некоторые записи в базе данных и при необходимости выдаст ошибку.

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, а также поставить проверку на контроллер. Я не хочу этого.

Наиболее похожая тема SO: Использование контекста БД в пользовательском атрибуте проверки (при добавлении контекста он все еще не работает)

Может ли кто-нибудь помочь мне передать ApplicationDbContext в модель для выполнения запросов и проверить его с помощью ValidationAttribute?

1 Ответ

0 голосов
/ 31 октября 2018

Я так и не нашел ответ, даже в переполнении стека. Но через много дней я получил решение. Итак, отвечаю ниже, надеюсь, это поможет.

Прежде всего, добавьте 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");

    }

  }
}
...