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

Другие вопросы по тегам