Проверка объекта EF7 на уровне службы

Мы создаем наше приложение, используя asp.net 5 и EF7 с архитектурой Onion. Мы не знаем, как проверять объекты перед их сохранением в базе данных на нашем сервисном уровне.

Наша структура такова;

ОСНОВНОЕ

  • Domain.Entities (POCO, созданные EF7)
  • Dto (чистые классы C# без аннотаций)

Инфраструктура

  • Данные (здесь у нас есть только DbContext, мы не используем репозитории)
  • Сервис (использует EF7 в качестве репозитория и выполняет все операции с базой данных. Сопоставляет POCO Domain.Entities с DTO и наоборот с помощью Automapper. Возвращает результаты DTO)

Презентация

  • Модели (аналогично DTO, но с атрибутами проверки)
  • Интернет (проект MVC 6. Контроллер потребляет службу и сопоставляет модели с DTO и наоборот и выполняет проверку с помощью моделей)

Наша проблема в том, что мы не знаем, как обрабатывать проверку на уровне службы. EF7 не проверяет сущность, как это было в старых версиях (https://github.com/aspnet/EntityFramework/wiki/Entity-Framework-Design-Meeting-Notes---July-17,-2014). Мы не хотим иметь еще один слой, похожий на DTO/модель, для службы, чтобы размещать в нем проверки, поскольку у нас есть проект модели на уровне представления.

Что было бы лучшим подходом?

Редактировать:

Мы пытались использовать DbEntityValidationException, как в EF7, для обработки проверки через EF, но обнаружили, что это невозможно. мы также пытались иметь классы проверки для каждого DTO на нашем сервисном уровне, но это не звучало для нас правильно, поскольку усложняло кодирование. Мы также попробовали следующий метод; Мы сгенерировали сущности с аннотациями данных с помощью инструмента reveng. И мы проверили классы сущностей следующим образом:

public class EntityBase 
{   
    public virtual DateTime CreatedDate { get; set; }
    public virtual string CreatedBy { get; set; }
    public virtual DateTime ModifiedDate { get; set; }
    public virtual string ModifiedBy { get; set; }
    public int RowVersion { get; set; }

}
public class MyEntity
{   
    public virtual int MyEntityId { get; set; }
    [MaxLength(50)]
    public virtual string Name { get; set;}

}
public static class EntityValidator
{
    public static ICollection<ValidationResult> Validate(this EntityBase entity)
    {
        if (entity == null) return new List<ValidationResult>();

        var validationErrors = new List<ValidationResult>();
        var context = new ValidationContext(entity, null, null);
        var isValid = Validator.TryValidateObject(entity, context, validationErrors,true);
        return validationErrors;
    }
}

так что это позволяет нам использовать его как; var errors = myEntity.Validate(); на нашем сервисном уровне.

Мы все еще ищем лучшее решение.


person Adem Tas    schedule 07.12.2015    source источник
comment
Сначала я попытался выполнить проверку с помощью EF и обнаружил, что EF больше не проверяет модели. (github.com/ aspnet/EntityFramework/wiki/). Я также попытался добавить классы проверки для каждого DTO на уровне службы, но мне это показалось неправильным. Я ищу идеальное решение для нашей ситуации здесь.   -  person Adem Tas    schedule 08.12.2015
comment
Я бы порекомендовал вам прочитать два фантастических ответа на такие вопросы, как проверка: это и это . Надеюсь, это может дать вам ответы.   -  person kayess    schedule 12.12.2015