1

Я видел много вопросов по проблеме ограничений внешнего ключа, и я получил то, что По умолчанию следующие ограничения не копируются клиенту: ограничения FOREIGN KEY, ограничения UNIQUE и ограничения по умолчанию DEFAULTSync Framework 2.1 Ограничения внешнего ключа

в этом документе: http://msdn.microsoft.com/en-us/library/bb726037.aspx

Таким образом, оказывается, что я должен «вручную» создать отношения, после того, как схема создается на клиенте.

Как только отношения были созданы на стороне клиента, что делать, если я делаю какие-либо изменения в таблицах на стороне сервера, я должен снова и снова воссоздавать все отношения на стороне клиента. Разве это не будет головной болью. Есть ли все равно, чтобы написать код или скрипт для создания ограничений внешнего ключа на стороне клиента, которые можно просто скопировать. и если мы внесем какие-либо изменения в схему таблиц на стороне сервера, которые можно было бы сделать на стороне клиента, изменив сценарий.

ответ

0

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

+0

возможность подробно остановиться на том, как вы это сделали Вы? – Brent

+0

Как мы знаем, мы можем создавать отношения между таблицами базы данных, просто «щелкнув правой кнопкой мыши по таблицам и добавляя ассоциации», а в cs-файле с помощью этого действия генерируется некоторый код .. поэтому просто записал этот код и после синхронизации, добавьте эти строки в ваши файлы cs, и это будет работать как реальные ограничения. –

+0

Вы хотите сказать, что вы добавили модель базы данных в Visual Studio и использовали изменения в DataClass.dbml и DataClass.designer.cs? – Brent

1

Sync Framework не может автоматически отображать изменения схемы, сделанные для синхронизируемых таблиц. будь то только FK, имя столбца/тип/длина, вам придется переустанавливать (если вы не хотите взломать свой путь на объектах синхронизации).

Если вы хотите полную верность схемы, я предлагаю вам сами создавать объекты базы данных (таблица, ограничение, sp, триггеры и т. Д.) И не позволять Sync создавать таблицы для вас.

и кстати, нет Sync Framework 4.0

+0

К сожалению это было Sync Framework 2.1 –

4

Я использую модифицированную версию образца http://code.msdn.microsoft.com/Database-Sync-SQL-Server-7e88adab#content Sql Server Express для сервера Sql через службу WCF.

Я использовал скрипт SQL Authority, чтобы сгенерировать скрипт Alter Table, чтобы добавить все внешние ключи http://blog.sqlauthority.com/2008/04/18/sql-server-generate-foreign-key-scripts-for-database/

Когда клиент обращается к службе WCF GetScopeDescription(), чтобы получить схему для клиента я бег выше Хранится Процедура добавления всех внешних ключей. Сценарий SQL возвратил, я ввел строку в поле DbSyncScopeDescription.UserComment, которое содержит скрипт и передает его клиенту одновременно с Схемой. Затем клиентская сторона после синхронизации области/схемы я могу запустить скрипт, создавая отношения.

DbSyncScopeDescription dbSyncScopeDescription = sqlSyncProviderProxy.GetScopeDescription(); 
sqlSyncScopeProvisioning.PopulateFromScopeDescription(dbSyncScopeDescription); 
sqlSyncScopeProvisioning.Apply(); 
string alterDatabaseScript = dbSyncScopeDescription.UserComment; 

Это относится к схеме/отношениям статической базы данных. Когда необходимы модификации схемы/отношений, я сначала отброшу клиентскую базу данных.

+1

Хорошее обходное решение ... – JuneT

1

У меня есть простой способ добавить ограничения внешнего ключа, просто сделайте txt-файл с командами SQL-кода внешнего ключа и дайте ';' после каждой команды SQL и использовать ниже код он прекрасно работает ...

private void FunAddForeignKeys() 
    { 
     SqlConnection clientConn = new SqlConnection(lconString); 
        if (clientConn.State == ConnectionState.Closed) 
         clientConn.Open(); 
        System.Data.SqlClient.SqlCommand Command = new System.Data.SqlClient.SqlCommand(GetSql("ForeignKeyQueries.txt"), clientConn); 

     try 
     { 
      Command.ExecuteNonQuery(); 
      MessageBox.Show("Foreign keys added"); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
     finally 
     { 
      // Closing the connection should be done in a Finally block 
      clientConn.Close(); 
     } 
} 
     private string GetSql(string Name) 
     { 
     try 
     { 
      // Gets the current assembly. 
      Assembly Asm = Assembly.GetExecutingAssembly(); 

      // Resources are named using a fully qualified name. 
      Stream strm = Asm.GetManifestResourceStream(Asm.GetName().Name + "." + Name); 

      // Reads the contents of the embedded file. 
      StreamReader reader = new StreamReader(strm); 
      return reader.ReadToEnd(); 

     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("In GetSQL: " + ex.Message); 
      throw ex; 
     } 
} 
+0

Я обязательно попробую. –