Sync Framework 2.1 Ограничения внешнего ключа
Я видел много Вопросов по проблеме ограничений внешнего ключа, и я получил следующее: по умолчанию следующие ограничения не копируются на клиент: ограничения FOREIGN KEY, ограничения UNIQUE и ограничения DEFAULT
в этом документе: http://msdn.microsoft.com/en-us/library/bb726037.aspx
Таким образом, кажется, я должен "вручную" создать отношения, как только схема создается на клиенте.
Как только отношения созданы на стороне клиента, что если я внесу какие-либо изменения в таблицы на стороне сервера, мне придется снова и снова воссоздавать все отношения на стороне клиента. Разве это не было бы головной болью. Есть ли в любом случае написать код или скрипт для создания ограничений внешнего ключа на стороне клиента, которые можно просто скопировать. и если мы внесем какие-либо изменения в схему таблиц на стороне сервера, что можно сделать на стороне клиента, изменив сценарий.
4 ответа
У меня есть решение, которое создает таблицу на стороне клиента посредством синхронизации, а затем добавляет код для генерации ограничений внешнего ключа. это простой способ, а не создавать все таблицы самостоятельно, а затем добавлять к ним ограничения. просто скопируйте строки для отношений и все.
Я использую модифицированную версию образца http://code.msdn.microsoft.com/Database-Sync-SQL-Server-7e88adab Sql Server Express для Sql Server через службу 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;
Это характерно для статической схемы базы данных / отношений. Когда понадобятся изменения схемы / отношений, я сначала отброшу клиентскую базу данных.
У меня есть простой способ добавить ограничения внешнего ключа, просто сделайте 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;
}
}
Sync Framework не принимает автоматически изменения схемы, сделанные в синхронизируемых таблицах. будь то просто FK, изменение имени / типа столбца / длины столбца, вам придется повторно предоставлять данные (если только вы не хотите взломать объекты синхронизации).
если вам нужна полная точность схемы, я предлагаю вам создать объекты базы данных самостоятельно (таблица, ограничение, sp, триггеры и т. д.) и не позволять самой Sync создавать таблицы для вас.
и между прочим, нет Sync Framework 4.0