powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / EF, Concurency и Order/Details
3 сообщений из 3, страница 1 из 1
EF, Concurency и Order/Details
    #38120569
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дано EF, и сферический в вакууме Order/Details как на картинке внизу. Также для Order и OrderDetail врублена Concurency Check через поле Version.

Как известно состояние Entry для Entiry Order не изменяется, при:
a) изменении детали в коллекции Details
б) удалении детали в коллекции Details
в) добавлении детали в коллекцию Details

В связи с этим при сохранении не поменяется и Version у Order. Потому можно при одновременном редактировании получить непонятки.

Потому не приходит ничего в голову кроме такого гавнакода, который в перечисленных выше случаях меняет у Entry, соответствующей Entity Order, состояние на Modified в случае, если текущее Unchanged.

Гавнакодец
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
                        // В случае, если удалены childs и concurency mode включен, меняем состояние parent
                        // на Modified, чтобы версия parent изменилась.
                        _ctx.OrderDetails.Local
                            .Where(od => (od.Id != 0) && (od.Order == null))
                            .ToList()
                            .ForEach(od => {
                                var parent = _ctx.Orders.Where(o => o.Id == od.OrderId).First();
                                var parentEntry = _ctx.Entry(parent);

                                if (parentEntry.State == EntityState.Unchanged)
                                    parentEntry.State = EntityState.Modified;
                            });

                        // В случае, если добавлены childs и concurency mode включен, меняем состояние parent
                        // на Modified, чтобы версия parent изменилась.
                        _ctx.OrderDetails.Local
                            .Where(od => (od.Id == 0) && (od.Order != null))
                            .ToList()
                            .ForEach(od => {
                                var parentEntry = _ctx.Entry(od.Order);

                                if (parentEntry.State == EntityState.Unchanged)
                                    _ctx.Entry(od.Order).State = EntityState.Modified;
                            });

                        // В случае, если изменены childs и concurency mode включен, меняем состояние parent
                        // на Modified, чтобы версия parent изменилась.
                        _ctx.OrderDetails.Local
                            .Where(od => (od.Id == 0) && (od.Order != null))
                            .ToList()
                            .ForEach(od =>
                            {
                                var childEntry = _ctx.Entry(od);
                                var parentEntry = _ctx.Entry(od.Order);

                                if ((childEntry.State == EntityState.Modified) && (parentEntry.State == EntityState.Unchanged))
                                    _ctx.Entry(od.Order).State = EntityState.Modified;
                            });

                        
                        // Удаляем orphan'ов, если таковые имеются.
                        _ctx.OrderDetails.Local
                            .Where(od => od.Order == null)
                            .ToList()
                            .ForEach(od => _ctx.OrderDetails.Remove(od));

                        _ctx.SaveChanges();




Может как-то проще можно?
...
Рейтинг: 0 / 0
EF, Concurency и Order/Details
    #38120574
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сори, скопипастил с ошибками код.

Fixed гавнакодец
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
                        // В случае, если удалены childs и concurency mode включен, меняем состояние parent
                        // на Modified, чтобы версия parent изменилась.
                        _ctx.OrderDetails.Local
                            .Where(od => (od.Id != 0) && (od.Order == null))
                            .ToList()
                            .ForEach(od => {
                                var parent = _ctx.Orders.Where(o => o.Id == od.OrderId).First();
                                var parentEntry = _ctx.Entry(parent);

                                if (parentEntry.State == EntityState.Unchanged)
                                    parentEntry.State = EntityState.Modified;
                            });

                        // В случае, если добавлены childs и concurency mode включен, меняем состояние parent
                        // на Modified, чтобы версия parent изменилась.
                        _ctx.OrderDetails.Local
                            .Where(od => (od.Id == 0) && (od.Order != null))
                            .ToList()
                            .ForEach(od => {
                                var parentEntry = _ctx.Entry(od.Order);

                                if (parentEntry.State == EntityState.Unchanged)
                                    _ctx.Entry(od.Order).State = EntityState.Modified;
                            });

                        // В случае, если изменены childs и concurency mode включен, меняем состояние parent
                        // на Modified, чтобы версия parent изменилась.
                        _ctx.OrderDetails.Local
                            .ToList()
                            .ForEach(od =>
                            {
                                var childEntry = _ctx.Entry(od);
                                var parentEntry = _ctx.Entry(od.Order);

                                if ((childEntry.State == EntityState.Modified) && (parentEntry.State == EntityState.Unchanged))
                                    _ctx.Entry(od.Order).State = EntityState.Modified;
                            });

                        
                        // Удаляем orphan'ов, если таковые имеются.
                        _ctx.OrderDetails.Local
                            .Where(od => od.Order == null)
                            .ToList()
                            .ForEach(od => _ctx.OrderDetails.Remove(od));

                        _ctx.SaveChanges();

...
Рейтинг: 0 / 0
EF, Concurency и Order/Details
    #38120580
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ох щи!

Fixed 2 Гавнакодец
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
                        // В случае, если удалены childs и concurency mode включен, меняем состояние parent
                        // на Modified, чтобы версия parent изменилась.
                        _ctx.OrderDetails.Local
                            .Where(od => (od.Id != 0) && (od.Order == null))
                            .ToList()
                            .ForEach(od => {
                                var parent = _ctx.Orders.Where(o => o.Id == od.OrderId).First();
                                var parentEntry = _ctx.Entry(parent);

                                if (parentEntry.State == EntityState.Unchanged)
                                    parentEntry.State = EntityState.Modified;
                            });

                        // В случае, если добавлены childs и concurency mode включен, меняем состояние parent
                        // на Modified, чтобы версия parent изменилась.
                        _ctx.OrderDetails.Local
                            .Where(od => (od.Id == 0) && (od.Order != null))
                            .ToList()
                            .ForEach(od => {
                                var parentEntry = _ctx.Entry(od.Order);

                                if (parentEntry.State == EntityState.Unchanged)
                                    parentEntry.State = EntityState.Modified;
                            });

                        // В случае, если изменены childs и concurency mode включен, меняем состояние parent
                        // на Modified, чтобы версия parent изменилась.
                        _ctx.OrderDetails.Local
                            .ToList()
                            .ForEach(od =>
                            {
                                var childEntry = _ctx.Entry(od);
                                var parentEntry = _ctx.Entry(od.Order);

                                if ((childEntry.State == EntityState.Modified) && (parentEntry.State == EntityState.Unchanged))
                                    parentEntry.State = EntityState.Modified;
                            });

                        
                        // Удаляем orphan'ов, если таковые имеются.
                        _ctx.OrderDetails.Local
                            .Where(od => od.Order == null)
                            .ToList()
                            .ForEach(od => _ctx.OrderDetails.Remove(od));

                        _ctx.SaveChanges();

...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / EF, Concurency и Order/Details
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]