Sync Framework 2.1外键约束

时间:2013-08-15 12:48:57

标签: entity-framework synchronization microsoft-sync-framework

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

本文档中的

http://msdn.microsoft.com/en-us/library/bb726037.aspx

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

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

4 个答案:

答案 0 :(得分:4)

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

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

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

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

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

答案 1 :(得分:1)

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

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

和btw,没有Sync Framework 4.0

答案 2 :(得分: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;
        }
}

答案 3 :(得分:0)

我有一个解决方案,通过同步创建客户端表,然后添加代码以生成外键约束。它很简单,而不是自己生成所有表,然后为它们添加约束。只需复制关系线就可以了。