powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Исключение по ForeignKeyConstraint
9 сообщений из 9, страница 1 из 1
Исключение по ForeignKeyConstraint
    #37353632
zuuu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Исключение по ForeignKeyConstraint
    #37354274
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Удаляйте из чилдрена, а потом из парента (если форин кей). Именно в такой последовательности. Что не понятно-то?
...
Рейтинг: 0 / 0
Исключение по ForeignKeyConstraint
    #37354310
zuuu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ShSerge,

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

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

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

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

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

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

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


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