Аннотация валидации - ядро ​​Entity Framework - PullRequest
0 голосов
/ 29 января 2020

У меня есть модель, которая размещена на моем бэкэнде в виде cs html. Эта модель также является представлением таблицы базы данных.

Этот код выглядит для HTTP POST следующим образом:

[HttpPost]
public IActionResult CreateAKG(Conversation akg)
{
    if (ModelState.IsValid && ValideD3OrD4Values(akg))
    {
        akg.RDPflichfelderBefuellt = true;
    }
    else
    {
        akg.RDPflichfelderBefuellt = false;
    }
    if (akg.Kommentare == null)
    {
        akg.Kommentare = new List<Kommentar>();
    }
    if (akg.AuftragsklaerungsgespraechId == 0)
    {
        this.MyDatabase.Conversation.Add(akg);
    }
    else
    {
        this.MyDatabase.Conversation.Update(akg);
    }
    this.MyDatabase.SaveChanges();
    return RedirectToAction("Index");
}

Класс, который представляет модель, называется Conversation. Есть некоторые свойства, которые аннотируются аннотациями проверки. Аннотация должна использоваться только Controller / ModelState.IsValid, а не для таблицы базы данных.

Вот пример кода:

public class Conversation
{
    public int ConversationId { get; set; }

    [Required(ErrorMessage = "This field is required.")]
    public DateTime? DatumAKG { get; set; }

    [MaxLength(256, ErrorMessage = "This field cannot be more than 256 characters")]
    public string KontierungFertigungskosten { get; set; }

    [MaxLength(256, ErrorMessage = "This field cannot be more than 256 characters")]
    public string KontierungQVP { get; set; }

    [MaxLength(256, ErrorMessage = "This field cannot be more than 256 characters")]
    public string KontierungLayoutkosten { get; set; }

    [MaxLength(256, ErrorMessage = "This field cannot be more than 256 characters")]
    public string KontierungBeschaffung { get; set; }
    public bool RDPflichfelderBefuellt { get; set; }
}

ModelState.IsValid используется только для проверить, является ли логическое значение истинным или ложным. Другие проверки не нужны.

Моя проблема заключается в том, что из-за аннотации данных строка, которая обычно может быть NULL в базе данных, теперь находится в дизайне базы данных, настроенном как NOT NULL.

Если я пытаюсь чтобы сохранить новый диалог в базе данных, выдается ошибка, что некоторые строковые значения не могут быть нулевыми.

То, что я хочу сделать, это:

  1. Проверка на контроллере

  2. Нет аннотации проверки, которая изменяет дизайн базы данных

1 Ответ

1 голос
/ 29 января 2020

Поскольку свойства и требования разные, у вас должно быть 2 разных объекта

// this is you database object
public class Conversation {
        [MaxLength(256, ErrorMessage = "This field cannot be more than 256 characters")]
        public string KontierungQVP { get; set; }

}

// this your Data Transfer Object
public class ConversationDTO {
        [MaxLength(256, ErrorMessage = "This field cannot be more than 256 characters")]
        [Required]
        public string KontierungQVP { get; set; }
}

Ваши модели EF всегда должны представлять базу данных. Если вы хотите добавить дополнительные проверки или условия, вы должны сделать это с другим объектом и просто перейти между этими объектами. Наличие двух разных типов объектов дает вам больше модульности.

РЕДАКТИРОВАТЬ:

Есть способ сделать то, что вы просите, но это не рекомендуемый подход, и это может вызвать проблемы. Вы хотите использовать 2 контекста и настроить необходимые свойства с помощью FluentAPI, а не аннотаций данных.

// Call this method in your context.
protected override void OnModelCreating(your_builder){
    modelBuilder.Entity<Conversation>()
        .Property(p => p.KontierungQVP)
        .IsRequired();
}

Как правило, вы хотите иметь 2 разных контекста. Тот, где вы будете инициализировать вашу базу данных. И еще один, в котором ваши обязательные атрибуты будут определены FluentAPI (не аннотациями данных).

Итак, резюмируем один DbContext для создания вашей БД и один для ваших операций. Конечно, это приведет к различиям, и легко будет забыть проверку в базе данных и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...