Гость
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / EF, Concurency и Order/Details / 3 сообщений из 3, страница 1 из 1
22.01.2013, 23:56
    #38120569
Lord British
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF, Concurency и Order/Details
Дано 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
23.01.2013, 00:02
    #38120574
Lord British
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF, Concurency и Order/Details
Сори, скопипастил с ошибками код.

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
23.01.2013, 00:08
    #38120580
Lord British
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF, Concurency и Order/Details
Ох щи!

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


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