Передача сущностей в представление не является хорошей практикой, и в зависимости от того, что вы делаете с ними, когда они возвращаются из представления, это может подвергнуть вас фальсификации данных. Ваша «TableViewModel» должна состоять только из сплюснутых полей гостя и контакта или GuestViewModel и ContactViewModel, отображающих только те ключи и детали, которые необходимо отобразить / отредактировать. Объекты предназначены для связи с DbContext. Помещение ссылки на них в модель представления лишает их значения. Когда вы передаете их обратно в контроллер, они становятся просто экземплярами POCO, которые десериализованы из данных JSON, поступающих из представления. У них нет отслеживания изменений и т. Д., Чего можно ожидать от использования сущностей, пока они только что загружены из DbContext. Вы можете присоединить их к DbContext, но вам придется вручную установить состояние объекта на «Изменено», иначе контекст не будет знать, что объект был изменен.
Ваша проблема в ее нынешнем виде, вероятно, будет связана с тем, что делает ваш метод SaveGuest.
Типичный жизненный цикл MVC для данных будет примерно равен:
Просмотр:
- Загрузка сущностей из контекста
- Заполнение просмотра моделей
- Перейти к просмотру.
Обновление:
- Проверка модели представления по текущему сеансу
- Загрузка сущностей из контекста на основе ключей
- Убедитесь, что модель представления не устарела (дата последнего мода / отметка времени / версия строки соответствуют)
- Проверка и копирование только тех деталей, которые можно обновить из модели представления в сущность
- SaveChanges.
Скорее всего, если вы не видите изменений, вы, вероятно, присоединяете сущность к новому контексту, не устанавливая состояние сущности в "Изменено". Обратите внимание, что не рекомендуется, поскольку вы безоговорочно доверяете данным, поступающим от клиента. Например, вы можете намереваться видеть только то, что пользователь изменил данные, для которых вы создали элементы управления, но прикрепляя объект, вы оставляете дверь открытой для перехвата POST-вызова или воспроизведения любых / всех данных на объекте, являющемся объектом. изменено. В любом случае вам нужно будет загрузить существующую сущность, чтобы убедиться, что ничего, что не должно было быть изменено, не было изменено. Другая возможность состоит в том, что вы можете перезагрузить сущность, не осознавая, не копируя значения из сущности вашей модели представления перед вызовом SaveChanges, или добавляя сущность в контекст, думая, что она обновит существующую строку, но она сохраняет совершенно новую строку с новый ПК.