locked
StackOverflowException на SubmitChanges RRS feed

  • Вопрос

  • Приветствую.

    Использую SQL CE под WP7/8. И сразу вопрос: из-за чего, при вызове context.SubmitChanges(ConflictMode.FailOnFirstConflict); // (context - это DataContext)

    приложение на старом эмуляторе для WP7 без виртуализации тупо вылетает, а на новом, с виртуализацией, выдаёт ошибку:

    "An unhandled exception of type 'System.StackOverflowException' occurred in System.Core.ni.dll"?

    Перед вызовом вышеуказанной строки context.GetChangeSet() говорит о наличии одного объекта для Update.

    При необходимости дам дополнительную информацию, какую запросите.



    • Изменено Aleksey Prikhodko 21 февраля 2014 г. 21:39 правописание
    21 февраля 2014 г. 21:38

Ответы

  • Нашёл ошибку. :(

    Тут:

    [Index(Columns = "IdWorkspace", IsUnique = true, Name = "IdWorkspace_Index")]

    Точнее в IsUnique = true. Если установить в false, то всё работает.

    Следовательно вопрос: почему PK нельзя делать уникальным?

    • Помечено в качестве ответа Aleksey Prikhodko 26 февраля 2014 г. 18:27
    26 февраля 2014 г. 18:27

Все ответы

  • Нужно больше кода. Из вышесказанного ошибку найти невозможно. 

    24 февраля 2014 г. 8:13
  • (Извините за оформление.)

                        

                    var dWorkspace = (d_Workspace)baseDbObject;

                    var exist = CompiledQueries.GetWorkspaceById(context, dWorkspace.IdWorkspace);
                    if (exist == null)
                    {
                        context.Workspaces.InsertOnSubmit(dWorkspace);
                    }
                    else if (exist.IsNotEqual(dWorkspace))
                    {

    // Вариант 1

                        //exist.Updated = dWorkspace.Updated;

    // Вариант 2

                        using (var ctx = new LocalStoreDataContext(LocalStoreDataContext.SharedMappingSource))
                        {
                            ctx.Workspaces.Attach(dWorkspace, true);
                            ctx.Refresh(RefreshMode.KeepCurrentValues, dWorkspace);
                            ctx.SubmitChanges();
                        }

                    }

    //context.SubmitChanges();

    Вариант 1 - это внесение изменений путём выборки существующего, изменения его свойств и последующей записи.

    Вариант 2 - это внесение изменений через отдельный Context путём Attach

    Вообщем, перепробовал очень много вариатов, а не только эти.

    Приведённые выше варианты дают указанную в начале темы ошибку.

    Если же вносить изменения через первый контекст путём Attach (как во втором варианте), то возникает ошибка "о дубликате первичного ключа".

    LocalStoreDataContext.SharedMappingSource - использую для того, чтобы можно было задействовать CompiledQuery.

    Весь этот код вызывается из ответа от веб-сервиса (может проблема в асинхронности?).

    24 февраля 2014 г. 13:06
  • Проверил: асинхронность не причём.
    25 февраля 2014 г. 8:05
  • LocalStoreDataContext.SharedMappingSource - тоже не при чём.
    25 февраля 2014 г. 9:42
  • Извините, я работал только с sqlite на WP. Можете собрать какой-то семпл с шагами воспроизведения, где можно проверить ошибку? По тексту сложно вникнуть и определить где ошибка.
    25 февраля 2014 г. 12:07
  • https://onedrive.live.com/redir?resid=C44D242A65128CD7!46790&authkey=!AJ5JmljiTrb7C_E&ithint=file%2c.zip

    Zip-файл. Запускаете первый раз. Объект успешно добавляется в базу.

    Запускаете второй раз - объект редактируется и возникает ошибка при записи изменений в базу.


    25 февраля 2014 г. 12:54
  • Нашёл ошибку. :(

    Тут:

    [Index(Columns = "IdWorkspace", IsUnique = true, Name = "IdWorkspace_Index")]

    Точнее в IsUnique = true. Если установить в false, то всё работает.

    Следовательно вопрос: почему PK нельзя делать уникальным?

    • Помечено в качестве ответа Aleksey Prikhodko 26 февраля 2014 г. 18:27
    26 февраля 2014 г. 18:27