【问题标题】:Sync Framework 2.1 Foreign key constraintsSync Framework 2.1 外键约束
【发布时间】:2013-08-15 12:48:56
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    我正在使用示例的修改版本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;
    

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

    【讨论】:

      【解决方案2】:

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

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

      顺便说一句,没有 Sync Framework 4.0

      【讨论】:

        【解决方案3】:

        我得到了添加外键约束的简单方法,只需制作外键 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;
                }
        }
        

        【讨论】:

        • 我一定会试试的。
        【解决方案4】:

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

        【讨论】:

        • 你能详细说明你是怎么做到的吗?
        • 我们知道我们可以通过“右键单击表并添加关联”来创建数据库表之间的关系,并且在 cs 文件中,此操作会生成一些代码.. 所以记下代码并在同步工作后,将这些行添加到您的 cs 文件中,它将像真正的约束一样工作。
        • 您的意思是您将数据库模型添加到 Visual Studio 并使用了 DataClass.dbml 和 DataClass.designer.cs 中的更改?
        • 我正在使用脚本来识别在blog.sqlauthority.com/2008/04/18/… 找到的所有外键,然后我将使用架构将此信息传递给客户端,然后客户端可以添加外键。
        • 是的,效果很好,刚刚在同步期间遇到问题 MERGE 语句与 FOREIGN KEY 约束冲突。但是我认为这与 MS Sync 插入新行的顺序有关。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多