343 / 305 / 135
Регистрация: 14.03.2015
Сообщений: 1,140
Записей в блоге: 1
1

Обновление связанных сущностей (каскадное обновление)

20.11.2016, 15:51. Показов 3353. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток.

У меня возникла проблема с обновлением сущности и связанной с ней сущности.

Подход к созданию бд - codefirst

Мои модели
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 public class Employee
    {
        public int Id { get; set; }
        public virtual ManInfo ManInfo { get; set; }
        public string Post { get; set; }
    }
    public class ManInfo
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string MiddleName { get; set; }
        public string SecondName { get; set; }
        public DateTime BirthDay { get; set; }
    }


В ходе работы желаю произвести изменение сущности Employee (включая и ManInfo).

C#
1
var m = Mapper.Map<Employee>(model);
Таким образом у меня получается сущность со всеми измененными свойствами (id присутствует как и у employee, так и у подмодели ManInfo)

Далее совершаю такое
C#
1
db.Entry(m).State = EntityState.Modified;
В результате получаю изменение сущности Employee (все изменилось), но у связанной сущности ManInfo изменения не происходят.

Пробовал такой способ
C#
1
2
var n = db.ManInfos.First(x => x.Id == mId);
db.Entry(n).State = EntityState.Modified;
Но результатов не дал.

Прошу помощи у вас - как правильно обновить сущность и связанную с ней сущность (подмодель)?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.11.2016, 15:51
Ответы с готовыми решениями:

Каскадное обновление данных C#
try { cn.Open(); cmd.Connection = cn; ...

Работа с Entity FrameWork обновление сущностей
Добрый день, у меня есть 2 сущности (работа и люди) со связкой 1 ко многим, есть необходимость...

Обновление элементов управления связанных с бд
Такой вопрос. Есть datagridview при добавлении новой строки она добавляется и в базу данных, но при...

Обновление связанных таблиц в datagridview
Есть кнопка на вывод информации: SqlConnection con; SqlDataAdapter sda; ...

8
Эксперт .NET
12081 / 8389 / 1283
Регистрация: 21.01.2016
Сообщений: 31,613
20.11.2016, 17:16 2
bodynar, никогда не трогай State сущности. Это свойство - только для мониторинга. Где ты такое решение увидел? Не заходи на тот сайт больше. Просто меняй свойства сущности, а потом вызывай метод SaveChanges() у контекста.
0
343 / 305 / 135
Регистрация: 14.03.2015
Сообщений: 1,140
Записей в блоге: 1
20.11.2016, 17:34  [ТС] 3
Usaga, изменение State сущности прописала студия по шаблону, когда создавал контроллер типизированный.

Хорошо, спасибо, сейчас попробую.

А если сущность получена путем мэппинга, но имеет id, который находится в бд, то изменение произойдет правильно?
0
Эксперт .NET
12081 / 8389 / 1283
Регистрация: 21.01.2016
Сообщений: 31,613
20.11.2016, 17:42 4
bodynar, да
1
343 / 305 / 135
Регистрация: 14.03.2015
Сообщений: 1,140
Записей в блоге: 1
20.11.2016, 17:44  [ТС] 5
Хм, возможно я что-то делаю не так.
C#
1
2
3
4
var m = Mapper.Map<Employee>(model);
            var origin = db.Employees.First(x => x.Id == m.Id);
            origin = m;
            db.SaveChanges();
не работает.
Как и другие вариации (без origin).

У меня такая логика:
Get-запрос -> отправка клиенту EmployeeViewModel, которая получается путем мэппинга из Employee ->
Редактирование на вьюхе -> Post-запрос -> получение Employee из отправленной клиентом EmployeeViewModel.
И необходимо изменить данные у сущности Employee.
0
Эксперт .NET
12081 / 8389 / 1283
Регистрация: 21.01.2016
Сообщений: 31,613
20.11.2016, 17:50 6
bodynar, в это коде ты просто меняешь ссылку, а не содержимое объекта на который она ссылается.
0
343 / 305 / 135
Регистрация: 14.03.2015
Сообщений: 1,140
Записей в блоге: 1
20.11.2016, 18:04  [ТС] 7
Usaga, хм, а есть ли возможность в меньшее число строк обновить сущность?

Изначально у меня было простое
C#
1
origin.Age = model.Age
и таких строк 10 аналогичных. Мэппером все собралось в одну строку, но
Цитата Сообщение от Usaga Посмотреть сообщение
просто меняешь ссылку
0
Эксперт .NET
12081 / 8389 / 1283
Регистрация: 21.01.2016
Сообщений: 31,613
20.11.2016, 18:28 8
Лучший ответ Сообщение было отмечено bodynar как решение

Решение

bodynar, тот же Automapper умеет не только создавать новую сущность, но и задавать свойства у уже существующей. Посмотри в документации или перегрузки через IntellySense.
1
343 / 305 / 135
Регистрация: 14.03.2015
Сообщений: 1,140
Записей в блоге: 1
20.11.2016, 18:57  [ТС] 9
Usaga, Большое спасибо за наводку.
Решение проще некуда. Нужно более явно указать, воспользовавшись перегрузкой.
C#
1
Mapper.Map<EmployeeViewModel, Employee>(model, origin);
0
20.11.2016, 18:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.11.2016, 18:57
Помогаю со студенческими работами здесь

Обновление связанных таблиц в DataGridView
Всем привет. Возник такой вопрос: как можно обновить связанную таблицу при программной сортировке...

Каскадное обновление связанных таблиц
Такое ощущение, что решение должно существовать. Есть необходимость изменить значение внешнего...

Каскадное обновление таблиц
Всем привет! Народ, помогите, не могу правильно составить SQL-запрос. Вот задача: Есть таблицы:...

Каскадное обновление записей
Помогите, пожалуйста, создать триггер на каскадное обновление записей. create trigger upDw for...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru