Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Исключение по ForeignKeyConstraint / 9 сообщений из 9, страница 1 из 1
15.07.2011, 14:59
    #37353632
zuuu
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение по ForeignKeyConstraint
1. датасет в составе двух таблиц tblParents и tblChilds. связаны по полю parent_id (Guid)

2. приложение создает два потока thrReader и thrWriter. ридер читает даные из внешнего устройства в Queue<>. райтер выбирает их из очереди и:
2.1. отображает в контролах
2.2 записывает в датасет

3. запись в датасет в райтере происходит следующим образом:
3.1 по некоторому событию получаем новый guid, сохраняем его, создаем запись в tblParents c этим guid
3.2 все данные, выбираемые после этого из Queue пишем в tblChilds с этим guid
3.2 всё повторяется с п. 3.1

но время от времени в п.3.2.получаю исключение по ForeignKeyConstraint. т.е. новый запись с новым guid в tblParents записана, а при добавлении записей в tblChilds его не видно.

в чем здесь у меня проблема, что я упустил?

куски из кода
Код: plaintext
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.
        // райтер. выполняется в отдельном потоке
        private void writeData()
        {
         ...
             if (needNewParent)
             {
                 currentParentId = appendParent(DateTime.Now);
                 needNewParent = false;
             } 

             writeChild(currentParentId, theSomeData);
         ...
        }

        private Guid appendParent(DateTime aDateTime)
        {
            Guid gd = Guid.NewGuid();
            writeParent(gd, aDateTime);
            return gd;
        }

        private void writeParent(Guid aGuid, DateTime aDateTime)
        }
            lock (datasetLocker)
            {
                theDatasetType.parentRow theParentRow = theDataSet.parents.NewparentRow();
                theParentRow.tube_id = aGuid;
                theParentRow.tube_date = aDateTime;
                theDataSet.parnets.AddparentsRow(theParentRow);
                theDataSet.AcceptChanges();
            }
        }

        private void writeChild(Guid aParentId, Single aSomeData)
        {
            if (aParentId != null)
            {
                lock (datasetLocker)
                {
                    theDatasetType.childsRow theChildRow = theDataSet.childs.NewchildsRow();
                    theChildRow.parent_id = aTubeId;
                    theChildRow.some_data = aSomeData;
                    theDataSet.childs.AddchildsRow(theChildRow); // <== вот здесь получаю исключение по ForeignKeyConstraint
                }
            }
        }
...
Рейтинг: 0 / 0
15.07.2011, 21:38
    #37354274
ShSerge
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение по ForeignKeyConstraint
Удаляйте из чилдрена, а потом из парента (если форин кей). Именно в такой последовательности. Что не понятно-то?
...
Рейтинг: 0 / 0
15.07.2011, 22:24
    #37354310
zuuu
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение по ForeignKeyConstraint
ShSerge,

не понятно, зачем надо удалять? :)
...
Рейтинг: 0 / 0
15.07.2011, 22:29
    #37354311
ShSerge
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение по ForeignKeyConstraint
zuuuShSerge,

не понятно, зачем надо удалять? :)
А записывайте именно в обратном порядке. :)
Это я уже заработался. :)
...
Рейтинг: 0 / 0
15.07.2011, 22:38
    #37354315
zuuu
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение по ForeignKeyConstraint
ShSerge,

в этом и вопрос. пишется всё в нужном порядке

впечатление, что запись в парент кешируется, и, при превышении некоторой скорости записи в чайлд, родительская запись ещё не видна при вставке дочерней
...
Рейтинг: 0 / 0
15.07.2011, 22:44
    #37354318
ShSerge
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение по ForeignKeyConstraint
zuuu,

Вообще-то это в одной транзакции надо делать. Ну, то есть, если инсертите одновременно и парент и чилд.
Хотя, нет. Не обязательно. Самое главное, чтобы парент уже был в базе.
...
Рейтинг: 0 / 0
15.07.2011, 22:46
    #37354321
ShSerge
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение по ForeignKeyConstraint
И самое главное - смотрите в профайлер. Он ответит на все вопросы. Вы, наверное, туда и не заглядывали... .
...
Рейтинг: 0 / 0
15.07.2011, 23:52
    #37354368
ViPRos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение по ForeignKeyConstraint
поробуй aarentId c Guid.Empty сравнивать
...
Рейтинг: 0 / 0
18.07.2011, 12:11
    #37355707
zuuu
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Исключение по ForeignKeyConstraint
всё вставляется в нужном порядке, сначала в парент, потом в чайлд. и гуид не пустой. эта ошибка проявляется именно тогда, когда эти операции выполняются подряд друг за другом. если пройти все пошагово в отладчике, ошибки нет. при прогоне выскакивает в случайные моменты

подозреваю, дело в автоматическом управлении транзакциями. спасибо ShSerge за наводку. если промежуток между операциями мал, транзакция, в которой вставляется чайлд ещё не видит запись, вставленную в парент. поэтому при пошаговом выполнении всё нормально.

вот, кстати, аналогичная проблема у человека http://www.sql.ru/forum/actualthread.aspx?tid=866861
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Исключение по ForeignKeyConstraint / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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