@WSGlebKavash

Как подружить MVC с реляционной базой данных?

Структура
Address.cs
public partial class Address
{
    public int CountryId { get; set; }
    public int CityId { get; set; }
    public Country Country { get; set; }
    public City City { get; set; }
}
Country.cs
public partial class Country
{
    public int AddressId { get; set; }
    public ICollection<Address> Address { get; set; }
}
City.cs
public partial class Country
{
    public int AddressId { get; set; }
    public ICollection<Address> Address { get; set; }
}
Controller.cs
if (ModelState.IsValid)
{
    //do something
}
Проект ASP.NET MVC с использованием СУБД MsSQL и EntityFrameworkCore. Всё работает, однако когда требуется сопоставление сложных типов, поялвяются ошибки валидации. Форма не может передать методу POST сложные типы, только примитивы, такие как числа и строки, поэтому обработка связанных записей происходит по их Id. Однако ModelState требует, чтоб были заполнены и CountryId, и Country одновременно. В противном случает выдаёт ошибку.
Как можно решить данную проблему? Как организовать добавление записей в базу данных из asp-form?
  • Вопрос задан
  • 77 просмотров
Решения вопроса 1
AshBlade
@AshBlade Куратор тега C#
Просто хочу быть счастливым
Сложные объекты, как раз могут передаваться, просто надо сделать формы другим образом. Скорее всего ты в этот asp-form передаешь всю модель. Предполагаю, что вся модель - это Address.
Да, из вложенных сложных структур плохо создаются формы. Для решения тебе надо будет форму вручную: все поля и их связь с моделью прописывать самому. Есть шаблонные помощники (Html.EditorFor и другие) - используй их.
Например, так (внимание, написал по воспоминаниям, может даже не компилироваться)
@Html.BeginForm() 
{
      <label>Страна</label>
      @Html.EditorForModel(x => x.Country)
      <label>Город</label>
      @Html.EditorForModel(x => x.City)
}


Кроме этого, есть пара других советов:
1. Создай специальные DTO классы, которые будут потом отображаться в эти объекты БД.
2. Раз ты делаешь через asp-form, то лушче добавь специальные атрибуты валидации: EmailAddress, Range и т.д.

P.S. в 1 пункте проблема глубже, чем простой маппинг. Если делать такой подход, который показан:
- Изменения схемы БД потребуют изменения UI
- Клиент может передать данные, о которых он знать не должен (например, добавишь новое поле куда-нибудь и оно случайно обновится)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
NikFaraday
@NikFaraday
Student full-stack Developer
Как подружить MVC с реляционной базой данных?

Та нормально они дружат через Entity Framework, Dapper либо другие ORM.

Форма не может передать методу POST сложные типы

А при чём тут ваш вопрос "Как подружить MVC с реляционной базой данных?", если вы не можете передать с клиента на сервер?

ModelState требует, чтоб были заполнены и CountryId, и Country одновременно.

Используйте модели. Просто создайте другой класс (Модель), который будете использовать для get/post запросов (По отдельности, одна модель - один запрос) и вынесите туда всё, что вам нужно. Обычно вам хватит только Id того объект с каким будете работать + поля, которые нужны для создания/обновления/добавления и т.д. Для удаления вам хватит просто Id, для обновления нужны только поля, которые нужно обновить и Id того объекта, который нужно обновлять. И будет вам работа с примитивами )

Для валидации вообще рекомендую накатить какую-то библиотеку по типу Fluent Validation Api либо Regex (Приоритетно)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы