2014-12-09 2 views
0

Я реализую структуру синхронизации в моем приложении Windows C#.microsoft sync framework Нарушение внешнего ключа

У меня есть пользователи таблицы, действия таблицы и таблица userActions, которая имеет внешний ключ для обеих таблиц.

Когда я определяю свою сферу в предоставления, порядок родитель, то ребенок:

DbSyncScopeDescription scopeDesc = ..... 

DbSyncTableDescription users = 
       SqlSyncDescriptionBuilder.GetDescriptionForTable("Users", new SqlConnection(ServerConnection)); 

DbSyncTableDescription userActions = 
       SqlSyncDescriptionBuilder.GetDescriptionForTable("UserActions", new SqlConnection(ServerConnection)); 

userActions.Constraints.Add(new DbSyncForeignKeyConstraint("FK_UserActions_Users")); 
userActions.Constraints.Add(new DbSyncForeignKeyConstraint("FK_UserActions_Actions")); 

scopeDesc.Tables.Add(users); 
scopeDesc.Tables.Add(userActions); 

Моя синхронизация должна произойти, когда пользователю присваивается определенное действие.

Так что, если я создаю пользователя 1 с действием x, пользователь синхронизируется. Если я создам пользователя 2 без действия x, он не будет синхронизирован. Все идет нормально.

Если теперь я назначаю действие x пользователю 2 и повторно применяю синхронизацию, пользователь 2 все еще не синхронизируется. то, что я заметил, что в моем случае «ApplyChangeFailed», я получаю ключ исключение иностранного нарушения:

Local Provider применяются изменения не удалось: Заявление ВСТАВИТЬ конфликтные с ограничением внешнего ключа «FK_UserActions_Users». Конфликт произошел в базе данных «LocalGenUM», таблице «dbo.Users», в столбце «Id».

Я застрял с этим в течение нескольких недель. Может ли кто-нибудь помочь?

ответ

0

Sync Fx не заботится о FK. ограничения, которые вы добавляете во время подготовки, до тех пор, пока вы создаете таблицы. Во время синхронизации это не волнует.

Sync Fx syncs by table. Когда вы добавили пользователя 2 и пропустили его синхронизацию, когда вы изменяете действие x, чтобы назначить пользователю 2, это была строка действия, которая была изменена, а не пользователь 2. поэтому во время синхронизации будет обнаружено только действие x, как изменено, и это тот, который будет синхронизироваться. Sync Fx не будет захватывать связанные с вами данные (опять же, это не касается этих отношений).

Почему вы не позволяете пользователю синхронизировать 2, когда он добавлен? если вы этого не сделаете, вам придется взломать набор данных изменений (либо в приложении Applyinghanges, либо ChangeSelected) во время синхронизации, чтобы захватить связанные данные, если они не существуют в таблице адресатов. Это просто усложняет синхронизацию.

+0

Вы говорите, что только действие x будет обнаружено как измененное, потому что это строка, которая была изменена, а не пользователь 2. Но даже если я попытаюсь внести изменения в оба, синхронизация не будет работать. Какие флаги меняют строку? – Nidal

0

Спасибо за помощь JuneT. Мы должны пойти на взлом, есть ли вероятность, что вы предоставите мне пример или намеки на его применение? Я отслеживал DataSet на событиях, о которых вы упомянули, я могу видеть 4 столбца, добавленные для каждой таблицы в области видимости (sync_update_peer_timestamp, sync_update_peer_key, sync_create_peer_timestamp, sync_create_peer_key), ключи имеют значение 0, а метки времени - 4 цифры целых чисел (например: 2001).

Я попытался манипулировать значениями временной метки, создав update = update, надеясь, что это заставляет систему считать ее новой записью. Однако это привело к ошибкам в DataSet.

PS: в наборе данных есть запись для обновленного пользователя и записи для его действий, но, похоже, синхронизация игнорирует пользователя и пытается вставить только действия, которые приводят к ошибкам нарушения FK (ApplyChangeFailed)

Смежные вопросы