1

我看过很多关于外键约束问题的问题,我得到的是默认情况下,以下约束不会复制到客户端:FOREIGN KEY 约束、UNIQUE 约束和 DEFAULT 约束

在本文档中:http: //msdn.microsoft.com/en-us/library/bb726037.aspx

因此,一旦在客户端上创建了架构,我似乎必须“手动”创建关系。

一旦在客户端创建了关系,如果我在服务器端对表进行任何更改,我必须一次又一次地在客户端重新创建所有关系。是不是很头疼。无论如何要编写代码或脚本来在客户端创建可以复制的外键约束。如果我们对服务器端表模式进行任何更改,这些更改可以通过更改脚本在客户端完成。

4

4 回答 4

4

我正在使用示例http://code.msdn.microsoft.com/Database-Sync-SQL-Server-7e88adab#content Sql Server Express 到 WCF 服务上的 Sql Server 的修改版本。

我使用 SQL Authority 的脚本生成了一个 Alter Table 脚本来添加所有外键http://blog.sqlauthority.com/2008/04/18/sql-server-generate-foreign-key-scripts-for-database /

当客户端调用 WCF 服务 GetScopeDescription() 以获取客户端的架构时,我运行上述存储过程以获取要添加的所有外键关系。返回的 SQL 脚本我在 DbSyncScopeDescription.UserComment 字段中放入了一个字符串,该字段保存脚本并将其与 Schema 同时传输到客户端。然后客户端在同步范围/模式后我可以运行脚本生成关系。

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

这是特定于静态数据库模式/关系的。当需要修改模式/关系时,我将首先删除客户端数据库。

于 2013-12-17T19:11:21.307 回答
1

Sync Framework 不会自动获取对正在同步的表所做的架构更改。无论它只是一个 FK、列名称/类型/长度更改,您都必须重新配置(除非您想在同步对象上破解自己的方式)。

如果您想要完整的模式保真度,我建议您自己创建数据库对象(表、约束、sp、触发器等),而不是让 Sync 自己为您创建表。

顺便说一句,没有 Sync Framework 4.0

于 2013-08-16T02:22:15.873 回答
1

我得到了添加外键约束的简单方法,只需制作外键 sql 命令的 txt 文件并给出 ';' 在每个 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;
        }
}
于 2014-03-21T10:50:59.313 回答
0

我有一个解决方案,通过同步创建客户端表,然后添加代码以生成外键约束。这是一种简单的方法,而不是自己生成所有表,然后向它们添加约束。只需复制关系线,仅此而已。

于 2013-08-16T11:43:00.237 回答