Редактирование сложной сущности
От: varenikAA  
Дата: 13.04.20 05:46
Оценка:
Допустим есть Company -> BankAccount -> Bank.

По get вытаскиваем весь граф Company.BankAccount.Bank.BankId.
Меняем банк, отправляем post и ловим ошибку Bank is null.
Выходит вся модель Asp.Net MVC способна работать только с первым уровнем свойств?
Складывается ощущение, что было бы удобней работать со сложными объектами-агрегатами на стороне клиента,
гоняя между клиентом и сервером только json по SignalR.
По факту ООП не подходит для Asp.Net MVC.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Редактирование сложной сущности
От: BlackEric http://black-eric.lj.ru
Дата: 14.04.20 11:23
Оценка:
Здравствуйте, varenikAA, Вы писали:

AA>Допустим есть Company -> BankAccount -> Bank.


AA>По get вытаскиваем весь граф Company.BankAccount.Bank.BankId.

AA>Меняем банк, отправляем post и ловим ошибку Bank is null.
AA>Выходит вся модель Asp.Net MVC способна работать только с первым уровнем свойств?
AA>Складывается ощущение, что было бы удобней работать со сложными объектами-агрегатами на стороне клиента,
AA>гоняя между клиентом и сервером только json по SignalR.
AA>По факту ООП не подходит для Asp.Net MVC.

В EF Core (вы же о нем?) есть такой метод Include
https://github.com/BlackEric001
Re[2]: Редактирование сложной сущности
От: varenikAA  
Дата: 15.04.20 02:28
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>Здравствуйте, varenikAA, Вы писали:



BE>В EF Core (вы же о нем?) есть такой метод Include

Иерархия объектов как я уже сказал Company включает BankAccount включает Bank
Привязка работает только при генерации формы после get-запроса:
  public class BankAccountModel : DataPageModel
  {
        [BindProperty]
        public Company Company { get; set; }

        public List<SelectListItem> BankList { get; set; }

        public void OnPost()
    {
        /* через <select asp-for="Company.Account.Bank.BankId"><option value="1">Sberbank</option>
            привязываем клиент меняет  банк
            здесь ловим ошибку Bank - NRE
        */
        
    }
  }


Приходится преобразовывать красивую ООП-модель к плоской ViewModel с простыми св-вами и перегонять данные из одной формы в другую. т.е. переходим к ФП программированию.

Теперь представим, что мы не пытаемся натянуть сову на глобус. Поднимаем сигналР,
Клиент вытягивает по Id json. Все что нужно js с поддержкой websocket, на сервере автоматически из json
получаем сложную модель без дополнительных трансформаций.
Правда, требуется спец по веб-программированию. Но в целом такой подход более правильным кажется.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[3]: Редактирование сложной сущности
От: BlackEric http://black-eric.lj.ru
Дата: 15.04.20 07:46
Оценка:
Здравствуйте, varenikAA, Вы писали:

AA>Приходится преобразовывать красивую ООП-модель к плоской ViewModel с простыми св-вами и перегонять данные из одной формы в другую. т.е. переходим к ФП программированию.


AA>Теперь представим, что мы не пытаемся натянуть сову на глобус. Поднимаем сигналР,

AA>Клиент вытягивает по Id json. Все что нужно js с поддержкой websocket, на сервере автоматически из json
AA>получаем сложную модель без дополнительных трансформаций.
AA>Правда, требуется спец по веб-программированию. Но в целом такой подход более правильным кажется.

Что-то я не пойму проблему.
Да, вы можете отдать с клиента только BankID и потом отдельным update его обновить в бд.
https://github.com/BlackEric001
Re[4]: Редактирование сложной сущности
От: varenikAA  
Дата: 15.04.20 08:29
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>Что-то я не пойму проблему.

BE>Да, вы можете отдать с клиента только BankID и потом отдельным update его обновить в бд.

Проблема здесь в распухании кода, увеличении сложности, дублировании.
По сути каждое поле придется обновлять вручную, хотя у нас уже есть структура данных описывающая сущность.
Теперь берем БИК и вот уже у нас простая строка летит в метод обновления базы,
за ним еще куча пропертей. Тут главное не перепутать какой стринг или инт в какое поле кинуть.
Вопрос в том, что действительно ли C# помогает в создании веб приложения или только мешает.
Возможно Asp.Net MVC не лучшая технология для клиента.
Вот WinForms + ООП работал очень неплохо. В вебе такая гибкость и простота возможна лишь при использовании
вавнильного js+hmtl. В крайнем случае ClojureScript.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Редактирование сложной сущности
От: Egorio Россия  
Дата: 15.04.20 13:28
Оценка: +1
Здравствуйте, varenikAA, Вы писали:

AA>Допустим есть Company -> BankAccount -> Bank.


AA>По get вытаскиваем весь граф Company.BankAccount.Bank.BankId.

AA>Меняем банк, отправляем post и ловим ошибку Bank is null.
AA>Выходит вся модель Asp.Net MVC способна работать только с первым уровнем свойств?
AA>Складывается ощущение, что было бы удобней работать со сложными объектами-агрегатами на стороне клиента,
AA>гоняя между клиентом и сервером только json по SignalR.
AA>По факту ООП не подходит для Asp.Net MVC.

Модель покажи.
json не надо гонять, надо передавать id сущности и поля модели в метод контроллера с которой будешь работать.
Company должно содержать Id BankAccount, а не всю BankAccount, BankAccount — BankId, а не Bank.

Пример изменения полей Bank:

var bank = db.Banks.FirstOrDefault( "условие поиска банка");
bank.field1 = "blabla";
bank.field2 = "blablabla";

db.SaveChanges();
или
db.SaSaveChangesAsync(); //если метод контроллера асинхронен
Re: Редактирование сложной сущности
От: Ромашка Украина  
Дата: 15.04.20 13:46
Оценка:
Здравствуйте, varenikAA, Вы писали:
AA>Допустим есть Company -> BankAccount -> Bank.
AA>По get вытаскиваем весь граф Company.BankAccount.Bank.BankId.
AA>Меняем банк, отправляем post и ловим ошибку Bank is null.

Эммм... Извините моё невежество — а вы чего хотели??? Ну смотри, есть у нас счет номер 40802810064580005678, в Сбербанке, который имеет BankId=1481. И мы меняем его на альфовский BankId=1326. И у нас получается счет номер 40802810064580005678 (в котором 6458 это номер отделения сбера) в Альфе? Что за хрень?


Всё, что нас не убивает, ещё горько об этом пожалеет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.