Попытка выполнить иерархическое обновление приводит к ошибке «Невозможно вставить значение внешнего ключа» - PullRequest
3 голосов
/ 15 сентября 2010

Я немного болтаю с DAO и SQL Server, и у меня возникает проблема, когда я пытаюсь вставить значения в две таблицы, которые имеют отношение.Таблица Photos имеет поле gpsId, которое имеет отношение внешнего ключа к полю id таблицы GPSLocations.Я хочу создать новую запись "Фотографии", связанную с новым местоположением GPS, поэтому код выглядит примерно так:

gpsRow = dataset.GPSLocations.AddGPSLocationsRow("0.0N", "3.2W");
dataset.Photos.AddPhotosRow(@"c:\path\file.jpg", gpsRow);
tableAdapterManager.UpdateAll(dataset); 

Однако это приводит к следующей ошибке:

ЧужойЗначение ключа не может быть вставлено, потому что соответствующее значение первичного ключа не существует.[Имя ограничения внешнего ключа = photoToGps]

Я использую SQL Server CE.Верно ли мое понимание того, что TableAdapterManager должен обрабатывать это иерархическое обновление?Я просто перетащил эти таблицы в представление XSD и использовал автоматическое создание классов-оболочек.Нужно ли что-нибудь изменить в отношении (например, сделать его ограничением внешнего ключа)?Я заметил, что при некоторых обстоятельствах идентификатор gps является положительным, а иногда и отрицательным, это уместно?

РЕДАКТИРОВАТЬ: я также гарантировал, что для свойства обновления установлено значение CASCADE, что приводит к той же ошибкеДля иерархических обновлений задано значение true, и между двумя таблицами в конструкторе существует ограничение внешнего ключа.

Ответы [ 5 ]

3 голосов
/ 24 сентября 2010

Это просто конфигурация вашего набора данных.Дважды щелкните отношение между таблицами в конструкторе наборов данных Visual Studio, выберите параметр И отношение, и ограничение ключа Foreigh , и в поле Правило обновления выберите параметр Каскад и выберитеэто должно быть.

Некоторая информация о предмете находится в MSDN, вы можете посмотреть здесь http://msdn.microsoft.com/en-us/library/bb629317.aspx и перейти к связанным темам.

2 голосов
/ 28 сентября 2010

Мне удалось отследить источник этой проблемы, которая сводится к ограничению SQL Server CE по сравнению с полным SQL Server. Оказывается, главный намек на то, что что-то было не так, был потому, что идентификаторы были отрицательными. Идентификаторы являются отрицательными в наборе данных перед вставкой строки в базу данных, после чего она преобразуется в положительный индекс. Тот факт, что он не стал положительным индексом, произошел потому, что TableAdapterManager обычно делает пакетный оператор INSERT, за которым следует SELECT для обновления идентификатора. Однако SQL Server CE не поддерживает пакетные операторы, поэтому для этого требуется написать дополнительный код, чтобы мы имитировали шаг SELECT, реагируя на событие RowUpdated. Эта статья MSDN объясняет шаги.

1 голос
/ 20 сентября 2010

Вы включили иерархические обновления, как описано здесь ?

1 голос
/ 21 сентября 2010

Есть ли ограничение по внешнему ключу между двумя таблицами (на конструкторе XSD должна быть строка, соединяющая их)?Поскольку ваши поля имеют разные имена, они могут не добавляться автоматически при перетаскивании таблиц в область конструктора.

0 голосов
/ 20 сентября 2010

Поскольку столбец photoToGps (внешний ключ) зависит от первичного ключа (id), вы не можете добавить photoToGps, если не присутствует соответствующий идентификатор. Так что вам нужно отдельные обновления, а не делать UpdateAll. Сначала обновите таблицу GPSLocations, а затем другую таблицу. Таким образом, у вас будет существующий идентификатор, прежде чем вы добавите для него photoToGPS.

...